Dom 我能';t通过JavaScript删除页面中的所有段落 HTML5文档

Dom 我能';t通过JavaScript删除页面中的所有段落 HTML5文档,dom,iteration,addeventlistener,removechild,getelementsbytagname,Dom,Iteration,Addeventlistener,Removechild,Getelementsbytagname,一, 二, 三, 四, 五, 六, 七, 八, 九, 十, 十一, 十二, //单击文档时,下面的代码应删除页面中的所有段落。 //页面中有12个段落,但下面的代码只能删除其中6个段落。 document.addEventListener('click',函数(){ 变量i,allParagraphElements=document.getElementsByTagName('p'); log('allParagraphElements.length:'+allParagraphElements

一, 二, 三, 四, 五, 六, 七, 八, 九, 十, 十一, 十二, //单击文档时,下面的代码应删除页面中的所有段落。 //页面中有12个段落,但下面的代码只能删除其中6个段落。 document.addEventListener('click',函数(){ 变量i,allParagraphElements=document.getElementsByTagName('p'); log('allParagraphElements.length:'+allParagraphElements.length); 对于(i=0;i 请参阅JSFIDLE上的代码:


我如何解决这个问题?谢谢。

.getElementsByTagName
返回一个实时节点列表,当您更改它所代表的基础子树时,该节点列表会自动更新。基本上,当您删除元素时,
.length
也会改变,循环将“过早”结束

您可以使用
.querySelectorAll
来获取静态节点列表


​ 还可以将节点列表转换为数组,其行为也类似于静态节点列表:

allParagraphElements = document.querySelectorAll('p');

.getElementsByTagName
返回一个活动节点列表,当您更改它所代表的基础子树时,该节点列表会自动更新。基本上,当您删除元素时,
.length
也会改变,循环将“过早”结束

您可以使用
.querySelectorAll
来获取静态节点列表


​ 还可以将节点列表转换为数组,其行为也类似于静态节点列表:

allParagraphElements = document.querySelectorAll('p');

您可以从上到下迭代:

迭代一: 12段,索引=0

索引0处的段落已删除,而段落1现在位于索引0处

第二次迭代: 11段,索引=1

删除索引1处的段落,第2段现在位于索引1处


你知道怎么了吗?你只删除了一半的段落

反过来迭代,所有段落都会被删除


您可以从上到下迭代:

迭代一: 12段,索引=0

索引0处的段落已删除,而段落1现在位于索引0处

第二次迭代: 11段,索引=1

删除索引1处的段落,第2段现在位于索引1处


你知道怎么了吗?你只删除了一半的段落

反过来迭代,所有段落都会被删除


小提琴很好,但用户不必只点击鼠标查看代码的基本原理。请尽可能将代码作为问题的一部分发布。什么是
1
意思?
p
标记在哪里结束?@d4rkpr1nc3:关闭

标记是可选的。不能有嵌套的
元素。小提琴很好,但是用户不应该只需要点击鼠标就可以看到代码的基本原理。请尽可能将代码作为问题的一部分发布。什么是
1
意思?
p
标记在哪里结束?@d4rkpr1nc3:关闭

标记是可选的。不能有嵌套的
元素。某些版本的IE不了解
addEventListener
。你应该考虑一下consideration@d4rkpr1nc3那不是我的密码,是OP的密码。我在这里不是要回顾OP代码中不相关的部分,除非它们确实是错误的:IE的PSome版本不知道
addEventListener
。你应该考虑一下consideration@d4rkpr1nc3那不是我的密码,是OP的密码。我来这里不是为了回顾OP代码中不相关的部分,除非它们真的错了:P
allParagraphElements = [].slice.call( document.getElementsByTagName('p') );