javascript中的动态节点列表的危险处理

本文深入探讨了动态节点列表的概念及其在HTML文档中的应用,解释了其动态变化带来的潜在风险,并提供了有效的解决策略。通过具体示例展示了如何避免在遍历和操作动态节点列表时可能遇到的问题,确保网页内容的正确性和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么叫节点列表:

<script> var x=document.getElementsByTagName("p"); </script>

中x这样的就叫做节点列表。

它们是危险的动态结构,为啥?

<a href="#">abc</a> <p>afefefd</p> <script> var x=document.getElementsByTagName("p"); alert(x.length); var par=document.createElement("P"); document.body.appendChild(par); alert(x.length); </script>
上述代码执行结果为:
然后显示
上述代码中的x只进行了一次定义,在新插入一个p元素前后显示了不同的内容,即时反应了当前文档中的变化,这让我想起C#中的LINQ查询中有个查询,是在foreach语句时才执行,也是能即时反应当前的变化。
为什么说这是危险的呢。
因为比如说:
<p rel="removed">a</p> <p>b</p> <p rel="removed">c</p> <p>d</p> <p rel="removed">e</p> <script> var waitingRoom=document.createElement("removed"); var x=document.getElementsByTagName("p"); for(var i=0;i<x.length;i++) { if(x[i].getAttribute("rel")) { waitingRoom.appendChild(x[i]); } } </script>

这是一段需要移除文档中所有的p标签的。可是因为x是动态的,所以在移除第一个时,x就更新了,x.length就减小1,此时i变成了1,但是文档中剩余的p标签中的首个此时应该是x[0],于是就没法删除它了,同理,第二次删除后,如果p标签很多,那么x[0],x[1]就没法删除了。谁让x那么即时的反应了当前的变化呢,有个解决方案如下:
<p rel="removed">a</p> <p>b</p> <p rel="removed">c</p> <p>d</p> <p rel="removed">e</p> <script> var waitingRoom=document.createElement("removed"); var x=document.getElementsByTagName("p"); for(var i=0;i<x.length;) { if(x[i].getAttribute("rel")) { waitingRoom.appendChild(x[i]); } else { i++; } } </script>
<pre name="code" class="javascript"waitingRoom.appendChild(x[i]);

方法会把节点x[i]从当前的位置剪切到waitingRoom中,也就相当于删除。当删除后,i不变化,当前节点不应该删除时才i++。这样就可以有效的删除所有带rel="removed"的元素了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值