for...in 循环不遍历所有属性?

for...in loop not looping through all properties?

当我加载我的页面时,会创建一个节点列表,它看起来像这样:

[text, h4, text, span, br, input, br, span, br, input, br, span, br, input, br, span, br, input, br]

我创建了一个简单的 for 循环,循环遍历所有这些元素并从 DOM 中删除每个元素。 (所有元素都在<section>

这是循环:

        for(element in videoTitlesElement.childNodes){
            if(!isNaN(element)){
                videoTitlesElement.removeChild(
                        videoTitlesElement.childNodes[element]);
            }
        }

但是,在循环结束时,nodeList 看起来像这样:

[h4, span, input, span, input, span, input, span, input]

并非所有元素都被删除。为什么?

谢谢。

两件事。首先,在遍历数字索引时不要使用 for ... in;使用普通的 for 循环。那么你就不需要那个 isNaN() 检查,而且它通常更安全。

第二个问题是,当您删除 child 时,您会更改列表的长度。如果你去掉child0,那么原来child1的child就变成了child0。这样,你真的想要的是一个简单的 while 循环:

while (videoTitlesElement.childNodes.length)
  videoTitlesElement.removeChild(videoTitlesElement.childNodes[0]);

或者,更简单:

while (videoTitlesElement.firstChild)
  videoTitlesElement.removeChild(videoTitlesElement.firstChild);

我还应该注意(假设您正在使用 HTML DOM)通过简单地爆破它来清除元素的所有 child 节点更容易.innerHTML:

videoTitlesElement.innerHTML = "";

如果您查看您的结果,您会注意到您跳过了第二个项目。

如果您将此想象成一个带有迭代器的 for 循环,您每次都会递增迭代器,但在再次递增之前从同一集合中删除一个项目。这意味着当您第一次开始循环时位于索引 1 的项目在您删除数组中的第一项后位于索引 0 。因此,当您查看索引 1 时,您已经跳过了该元素。这一直持续到循环结束,所以你错过了第二个项目。

正在迭代的列表 (videoTitlesElement.childNodes) 在迭代过程中正在发生变化。尝试迭代原始列表的副本:

var children = [].slice.call(videoTitlesElement.childNodes);

for(element in children){
    if(!isNaN(element)){
         videoTitlesElement.removeChild(videoTitlesElement.childNodes[element]);
    }
}