2011-10-29 19 views
3

我得到DOM对象数组使用getElementsByClassName更改数组中DOM对象的属性是否将该对象从数组中移除?

a = document.getElementsByClassName("foo"); 

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

a[0].className = "bar"; 

看来,这只是称为a[0]的对象现在从a删除。 a.length现在是2

我想知道为什么会发生这种情况。我定义了a一次,但后来修改其元素似乎影响a的会员资格。有人可以解释这个吗?

+0

我从pimvdb的'了'上面实际上不是一个数组而是一个节点列表,这给了这种行为学删除“活跃度”。 – sawa

回答

3

如果您使用querySelectorAll收集元素,则包含它们的对象将不会生效,并且代表网页的快照。您还可以通过转动节点列表到一个普通的基于阵列

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

感谢您提供解决方案。您的解决方案非常优雅,并且工作完美。 – sawa

+0

+1您可以删除',0'部分。 – pimvdb

5

根据the specification获得的NodeList(一种魔法阵列)是live

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

例如,如果一个DOM用户得到含有元素的子元素的NodeList对象,随后添加更多的儿童到该元素(或移除儿童,或修改它们),这些变化会自动反映在节点列表 ,而不需要用户的进一步行动。

+0

谢谢你,你明确表达了我的观点,并且是一个完美的答案,但我接受了肯尼贝克的回答,因为它进一步给了我一个解决方案,而这正是我想要的。 – sawa