2012-05-14 160 views
0

具体而言,我想重写每个浏览器中可用的getElementsByClassName函数,但IE除外。 IE使用querySelectorAll代替。覆盖原生Javascript函数

Element.prototype.getElementsByClassName = function(className) { 
    if(document.getElementsByClassName) { 
     return this.getElementsByClassName(className); 
    } else if(document.querySelectorAll) { 
     return this.querySelectorAll(className); 
    } 
}; 

但是,当在Firefox中运行代码时,它使用本地函数代替。如果getElementsByClassName不可用,或者是否有一种方法可以重写本机函数以便我的代码每次都使用,那么这仍然可以作为跨浏览器解决方案并使用我的原型吗?我可以将原型命名为相似的名称,但为了便于阅读,id宁愿保持原样。

+2

为什么不使用真正的垫片(polyfill)呢?即:'if(!Element.prototype.getElementsByClassName){Element.prototype.getElementsByClassName = function(){...}; }'http://polyfilljs.com/polyfills/getelementsbyclassname.html –

+0

你很困惑,* getElementsByClassName *是一个[host](http://es5.github.com/#x4.3.8)方法,而不是[native ](http://es5.github.com/#x4.3.6)方法。 – RobG

+0

@ MattBall--不要使用这种方法。你不能指望能够以这种方式修改** host **对象或方法(研究为什么Prototype.js将其作为一种策略)。如果尝试了,至少应该包括全面的功能测试。 – RobG

回答

1

我只是想将Matt Ball的答案作为这个问题的一个真实的接受答案。正如他所说的,最好使用polyfill而不是我最初设置的方式。

if(!Element.prototype.getElementsByClassName) { 
    Element.prototype.getElementsByClassName = function(className) { 
     return this.querySelectorAll(className); 
    } 
} 
+1

这并不是一个特别好的解决方案,因为许多浏览器都没有为DOM对象实现原型无约束机制(通常是那些没有* getElementsByClassName *的机制)。它也缺乏合适的特征检测,这是至关重要的。 – RobG

+0

你应该再看看polyfill的实际工作原理。 http://polyfilljs.com/js/mylibs/getelementsbyclassname.js –

+0

@RobG你有没有更好的解决方案,你不介意分享? – ryandlf