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

Bog*_* M. 4 javascript for-loop nodelist for-in-loop

当我加载页面时,会创建一个nodeList,它看起来像这样:

[text, h4, text, span, br, input, br, span, br, input, br, span, br, input, br, span, br, input, br]
Run Code Online (Sandbox Code Playgroud)

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

这是循环:

        for(element in videoTitlesElement.childNodes){
            if(!isNaN(element)){
                videoTitlesElement.removeChild(
                        videoTitlesElement.childNodes[element]);
            }
        }
Run Code Online (Sandbox Code Playgroud)

但是,在循环结束时,nodeList如下所示:

[h4, span, input, span, input, span, input, span, input]
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Poi*_*nty 11

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

第二个问题是,当您删除子项时,您更改列表的长度.如果你删除了孩子0,那么曾经是孩子1的孩子就变成了孩子0.因此,你真正想要的是一个简单的while循环:

while (videoTitlesElement.childNodes.length)
  videoTitlesElement.removeChild(videoTitlesElement.childNodes[0]);
Run Code Online (Sandbox Code Playgroud)

或者,更简单:

while (videoTitlesElement.firstChild)
  videoTitlesElement.removeChild(videoTitlesElement.firstChild);
Run Code Online (Sandbox Code Playgroud)

我还应该注意(假设您正在使用HTML DOM),通过简单地通过.innerHTML以下方式对其进行清理,可以更轻松地清除元素的所有子节点:

videoTitlesElement.innerHTML = "";
Run Code Online (Sandbox Code Playgroud)