2012-05-14 159 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