更改数组中DOM对象的属性是否从数组中删除该对象?

时间:2011-10-29 21:18:02

标签: javascript arrays dom

我使用getElementsByClassName得到了一个DOM对象数组:

a = document.getElementsByClassName("foo");  

此时,假设a.length3。然后,在一些函数调用期间,我想通过更改其类名来切换其中一些对象的属性。例如,我修改了a[0]的类名:

a[0].className = "bar";

似乎刚刚调用a[0]的对象现已从a中移除。 a.length现在是2

我想知道为什么会这样。我将a定义了一次,但后来对其元素的修改似乎影响了a的成员资格。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:5)

根据the specification,您获得的NodeList(一种神奇数组)是 live

  

DOM中的NodeList和NamedNodeMap对象是 live ;也就是说,对底层文档结构的更改将反映在所有相关的NodeList和NamedNodeMap对象中。

     

例如,如果DOM用户获取包含Element子项的NodeList对象,则随后会向该元素添加更多子项(或删除子项或修改它们),这些更改会自动反映在NodeList中,无需对用户采取进一步行动。

答案 1 :(得分:3)

如果使用querySelectorAll收集元素,则包含它们的对象将不会生效,并表示网页的快照。您还可以通过将节点列表转换为普通数组来删除“活跃度” -

a= [].slice.call(a,0)