我使用getElementsByClassName
得到了一个DOM对象数组:
a = document.getElementsByClassName("foo");
此时,假设a.length
为3
。然后,在一些函数调用期间,我想通过更改其类名来切换其中一些对象的属性。例如,我修改了a[0]
的类名:
a[0].className = "bar";
似乎刚刚调用a[0]
的对象现已从a
中移除。 a.length
现在是2
。
我想知道为什么会这样。我将a
定义了一次,但后来对其元素的修改似乎影响了a
的成员资格。有人可以解释一下吗?
答案 0 :(得分:5)
根据the specification,您获得的NodeList
(一种神奇数组)是 live 。
DOM中的NodeList和NamedNodeMap对象是 live ;也就是说,对底层文档结构的更改将反映在所有相关的NodeList和NamedNodeMap对象中。
例如,如果DOM用户获取包含Element子项的NodeList对象,则随后会向该元素添加更多子项(或删除子项或修改它们),这些更改会自动反映在NodeList中,无需对用户采取进一步行动。
答案 1 :(得分:3)
如果使用querySelectorAll收集元素,则包含它们的对象将不会生效,并表示网页的快照。您还可以通过将节点列表转换为普通数组来删除“活跃度” -
a= [].slice.call(a,0)