考虑一下我想将一个元素的所有 Descendant 的 tagName 放入一个数组中。
var node = document.getElementById('mainbar');
但是,由于我们使用下面的函数循环遍历多个节点,因此我添加了一个setTimeout函数,以在每 50 个循环后超时该函数。
function MyFunction(root){
"use strict";
var myarray = [], descendants, descendant, i=1, l;
descendants = root.getElementsByTagName('*');
function getParentNode(){
for(l = descendants.length; i<l ; i++){
descendant = descendants[i];
myarray.push({ tagName: descendant.tagName});
// After 50 loops, increment i, setTimeout
if(i % 50 == 0 ) {
i++;
setTimeout(getParentNode, 20);
}
}
}
function init(){
getParentNode();
return JSON.stringify({ nodes:myarray });
}
return init();
}
但是,有两个问题:
- 不返回完整的数组 (myarray)。
- 即使我使用了 setTimeout,当过程很长时屏幕也会冻结。
我该如何解决它们?我的意思是我使用了 setTimeout 以便该页面不会变得无响应。
PS:您可以在 Stackoverflow 本身上测试脚本,因为它包含一个 id 为 mainbar 的元素。我同意获取标记名不会花费这么长时间,但我也在计算其他一些东西,例如每个元素的过滤 getComputedStyle,这肯定需要相当长的时间。我把这个问题作为概念证明来了解如何使用 setTimeout 来阻止脚本响应