循环的Javascript不';t退出并不断更新getElementsByTagName变量
我有一个简单的javascript代码片段循环的Javascript不';t退出并不断更新getElementsByTagName变量,javascript,Javascript,我有一个简单的javascript代码片段 函数foo(){ bar(); } 功能条(){ var tags=document.getElementsByTagName('example'); 对于(var i=0;i
函数foo(){
bar();
}
功能条(){
var tags=document.getElementsByTagName('example');
对于(var i=0;i
及其同级DOM方法返回元素的实时HTMLCollection,这意味着如果添加了与查询匹配的新元素,则包含对HTMLCollection引用的变量将被更新。你应该:
a) 用于“分离”集合:
var tags = Array.from(document.getElementsByTagName('element'));
或者,如果您没有可用的Array.from
,则可以使用Array.prototype.slice
:
var tags = Array.prototype.slice.call(document.getElementsByTagName('a'), 0)
b) 不添加与正在迭代的查询匹配的元素(这将创建一个无限循环)
这也是为什么建议您在for
循环中迭代一组元素时,在迭代之前捕获列表的长度,并将其用作循环边界:
var tags = document.getElementsByTagName('example');
var length = tags.length;
for (var i = 0; i < length; i++) {
// won't be infinite
document.createElement('example');
...
}
var tags=document.getElementsByTagName('example');
变量长度=tags.length;
对于(变量i=0;i
及其同级DOM方法返回元素的实时HTMLCollection,这意味着如果添加了与查询匹配的新元素,则包含对HTMLCollection引用的变量将被更新。你应该:
a) 用于“分离”集合:
var tags = Array.from(document.getElementsByTagName('element'));
或者,如果您没有可用的Array.from
,则可以使用Array.prototype.slice
:
var tags = Array.prototype.slice.call(document.getElementsByTagName('a'), 0)
b) 不添加与正在迭代的查询匹配的元素(这将创建一个无限循环)
这也是为什么建议您在for
循环中迭代一组元素时,在迭代之前捕获列表的长度,并将其用作循环边界:
var tags = document.getElementsByTagName('example');
var length = tags.length;
for (var i = 0; i < length; i++) {
// won't be infinite
document.createElement('example');
...
}
var tags=document.getElementsByTagName('example');
变量长度=tags.length;
对于(变量i=0;i