不知道你有没有在控制台见到过类似这样的输出
我们会发现,同样都是获取元素的代码,为啥一个是NodeList,一个是HTMLCollection。
那么这俩是啥?又有啥区别,本篇文章我们就聊聊这个。
NodeList
NodeList
对象是节点的集合(类数组)。通常是由属性,如Node.childNodes
和 方法(如document.querySelectorAll
) 返回的。
在一些情况下,NodeList
是一个实时集合,也就是说,如果文档中的节点树发生变化,NodeList
也会随之变化。
例如,Node.childNodes
是实时的:
var parent = document.getElementById("parent");
var child_nodes = parent.childNodes;
console.log(child_nodes.length); // 我们假设结果会是“2”
parent.appendChild(document.createElement("div"));
console.log(child_nodes.length); // 但此时的输出是“3”
在其他情况下,NodeList
是一个静态集合,也就意味着随后对文档对象模型的任何改动都不会影响集合的内容。比如 document.querySelectorAll
就会返回一个静态 NodeList
。
HTMLCollection
HTMLCollection
对象是元素的集合(类数组),元素顺序为文档流中的顺序。HTMLCollection
是即时更新的,当其所包含的文档结构发生改变时,它会自动更新。
备注: 由于历史原因(DOM4 之前,实现该接口的集合只能包含 HTML 元素),该接口被称为 HTMLCollection。
下面这些方法可以返回HTMLCollection
.
document.getElementsByName
document.getElementsByTagName
document.getElementsByClassName
document.forms、document.forms[0].elements、 document.images、 document.links
总结
所以,总结下
相同点:
- 二者都是类数组
不同点
- NodeList是节点(12种)的集合、HTMLCollection是元素节点的集合
- NodeList有静态的、有动态的,HTMLCollection都是动态集合
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。