以下函数只返回文档中具有指定标记名的元素。由于某些原因,在连续调用函数时,它的执行变得越来越慢..我已经彻底测试了它并且原因中的for循环行,但是我不明白为什么这会导致连续调用的速度减慢
function getElementsByTagName2(tagName){
var arr=new Array();
var elems=document.getElementsByTagName(tagName);
for(var i=0, len=elems.length; i!=len; arr.push(elems[i++]));
return arr
}
编辑:更改变量名称以取悦user257493。
EDIT1:刚刚测试过的jQuery,它有同样的问题。虽然退化很小。
答案 0 :(得分:1)
我已经测试了你的代码,它似乎运行得很好。
我的结果(迭代 - >所用时间(找到div):
<强> 1。火狐:强>
0 - &gt; 1524(找到102)
1 - &gt; 1534(找到102)
2 - &gt; 1518(找到102)
3 - &gt; 1528(找到102)
4 - &gt; 1535(找到102)
...
15 - &gt; 1513(找到102)
16 - &gt; 1512(找到102)
17 - &gt; 1513(找到102)
18 - &gt; 1513(找到102)
19 - &gt; 1518(找到102)
<强> 2。铬:强>
0 - &gt; 387(找到102)
1 - &gt; 283(找到102)
2 - &gt; 268(找到102)
3 - &gt; 272(找到102)
4 - &gt; 271(找到102)
...
15 - &gt; 270(找到102)
16 - &gt; 279(找到102)
17 - &gt; 267(找到102)
18 - &gt; 287(找到102)
19 - &gt; 272(找到102)
答案 1 :(得分:0)
你的功能运行之间发生了什么? DOM如何变化?由于你的返回元素数量增加,每次连续采取的可能性有多大?此外,推进很慢。这也有效,可能会加快你的速度 - 我在重复执行中没有显示任何延迟。
function getElementsByTagName2(tagName) {
var arr = new Array(),
elems = document.getElementsByTagName(tagName);
for (var i = 0, len = elems.length; i != len; arr[i] = elems[i], ++i);
return arr;
}
答案 2 :(得分:0)
尝试直接分配数组元素,无需推送。
function getElementsByTagName2(tag, pa){
pa= pa || document;
tag= pa.getElementsByTagName(tag);
var L= tag.length, A= [];
while(L){
A[--L]= tag[L];
}
return A
}
getElementsByTagName2('*',document.body)
答案 3 :(得分:0)
Prototype to-array方法是否有同样的问题?
function $A(iterable) {
if (!iterable) return [];
if ('toArray' in Object(iterable)) return iterable.toArray();
var length = iterable.length || 0, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}