我想有些網站使用原型。 DOM的document.getElementsByClassName()
返回NodeList
,而原型的document.getElementsByClassName()
返回Array
,因爲NodeList
s不能由JS腳本創建。
在Firefox中,你可以使用
var node = document;
Components.lookupMethod(node, 'getElementsByClassName').call(node, /* className */);
得到原始方法。也許谷歌瀏覽器實現類似的東西,否則你會失敗。我找不到任何東西(2分鐘谷歌搜索)。
在這種情況下,你可以使用這樣的事情:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
className = className.replace(/([\.\\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\$1');
var regex = new RegExp('(?:^|[\\n\\r ])' + className + '(?:[\\n\\r ]|$)');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(regex.test(nodeList[ i ].className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
如果谷歌瀏覽器實現node.classList
您可以使用下面的函數,它不使用正則表達式令人毛骨悚然:
function getElementsByClassName(node, className) {
var rv = new Array();
var nodeList = node.getElementsByTagName('*');
for(var length = nodeList.length, i = 0; i < length; ++i) {
if(nodeList[ i ].classList.contains(className)) {
rv.push(nodeList[ i ]);
}
}
return rv;
}
此功能迭代給定節點內的所有元素。它返回一個像Prototype這樣的數組,並共享相同的缺點:數組不像「活」,如NodeList
s。
可以預先緩存,或者更改這些腳本添加支持,只有當原生支持不存在(最應該做到這一點無論如何),但一旦它的覆蓋,你不能拿回來。 – davin 2012-02-08 13:22:33
@達文不幸的是,我不擁有/控制頁面或腳本。 – asleepysamurai 2012-02-08 13:25:40
就像我說的,我寫一個書籤,而不是已嵌入到網頁中的腳本。所以我不能修改其redines getElementsByClassName方法,這就是爲什麼我要尋找訪問它的其他方式的功能。 – asleepysamurai 2012-02-08 13:31:08