[英]Javascript for loop not working properly?
我编写的“清理”函数存在问题,请参见下面的代码,我将在下面解释其工作原理。
clean: function (e) {
var
els = null,
i = 0;
if (e === undefined) {
e = this.cont;
}
els = e.getElementsByTagName('*');
for (i=0;i<els.length;i++) {
if (els[i].className.search('keep') === -1) {
e.removeChild(els[i]);
}
}
return this;
},
参数e是一个dom元素(如果未提供的话)。cont也是一个在整个函数中存储较早的dom元素,并且e默认为它。
该函数循环遍历所有子元素,并检查其是否没有保留类(这显然是做什么的),并删除所有不匹配的元素。
一切似乎都在工作,但是我有一个包含2个图像和2个输入的元素,而“ keep”类却没有,但是变量i仅变为2且循环停止(它应该达到4并删除所有四个元素)
任何帮助将不胜感激。
/ *更新* /
感谢@pimvb和@Brett Walker,最终的代码效果很好。
clean: function (e) {
var
els = null,
i = 0;
if (e === undefined) {
e = this.cont;
}
els = e.getElementsByTagName('*');
i = els.length;
while (i--) {
if (els[i].className.search('keep') === -1) {
els[i].parentNode.removeChild(els[i]);
}
}
return this;
},
.getElementsByTagName
函数返回一个NodeList
,它基本上是一个数组,但是是“活动的”,这意味着如果您例如删除一个孩子,它会自动更新。 所以当迭代, els.length
正在发生变化,从而导致被2
时删除2个孩子(有4 - 2 = 2
左)。 删除2个孩子后, i == 2
因此循环将过早结束,达到您的期望。
为了避免这种情况并使它成为“静态”数组,可以将其转换为这样的数组,该数组不会自我更新:
els = [].slice.call(e.getElementsByTagName('*')); // [].slice.call is a trick to
// convert something like a NodeList
// into a static, real array
正如Brett Walker指出的那样,您还可以向后迭代,如下所示:
http://jsfiddle.net/pimvdb/cYKxU/1/
var elements = document.getElementsByTagName("a"),
i = elements.length;
while(i--) { // this will stop as soon as i == 0 because 0 is treated as false
var elem = elements[i]; // current element
if(elem.className == "test") // remove if it should be removed
elem.parentNode.removeChild(elem);
}
这将从最后一个元素开始。 .length
仍会更新(即变小),但这无关紧要,因为您仅在开始时使用它,而不是在迭代过程中使用。 因此,您不会遭受这种“怪癖”的困扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.