首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的JS -循环混淆

简单的JS -循环混淆
EN

Stack Overflow用户
提问于 2013-11-24 17:04:37
回答 2查看 93关注 0票数 0

在本例中,我希望删除所有的pararaphes。但是正如你所看到的,下面的for循环并没有全部删除它们,它仍然把第一段留给我。http://codepen.io/vinhnghi223/pen/jnkzh

代码语言:javascript
复制
article=document.getElementsByTagName("article")[0];

for (i=0; i<article.childNodes.length; i++) {
 article.removeChild(article.lastChild);
}

但是,如果我将代码更改为i<4 (它小于返回5的article.childNodes.length),它就能工作。

我明白了为什么article.childNodes.length返回5,这让我感到困惑,因为我认为如果它适用于4,那么它应该适用于5。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-24 17:10:28

这是因为您正在更改正在循环的集合。您正在从零向上循环,同时要删除子节点,这样循环的上限就会越来越低。在中间,您的循环计数器将处理不断缩小的子节点数,循环结束。

要使该循环正常工作,您需要保留子节点的初始数目:

代码语言:javascript
复制
var cnt = article.childNodes.length;
for (i = 0; i < cnt; i++) {
  article.removeChild(article.lastChild);
}

但是,当还剩下任何子节点时,您可以只循环:

代码语言:javascript
复制
while (article.childNodes.length> 0) {
  article.removeChild(article.lastChild);
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-24 17:07:48

这是因为.childNodes集合每次删除都会更新。因此,在每次迭代时,.length都在缩小,而i在增长。由于您要删除.lastChild,您将在中间会议结束,因此前半部分将不会被删除。

当你硬编码原来的长度,你就消除了这个问题。

如果您的目的是删除所有的子级,那么只需进行条件检查,看看是否存在.lastChild

代码语言:javascript
复制
while (article.lastChild) {
    article.removeChild(article.lastChild);
}

像这样的"Live“节点列表可能很棘手,所以在循环中修改它们的元素时总是需要小心的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20177295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档