前言
HTMLCollection 和 NodeList 分别对应通过 document.getElementsByClassName 和 document.querySelectorAll 获取到的元素伪数组集合。
什么是伪数组可以看本人另一篇文章:JavaScript中的常见伪数组以及如何将伪数组转成真数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="container"></div>
<script>
Array.from({ length: 5 }, (_, i) => i).map(item => {
const div = document.createElement('div');
div.className = 'item';
div.textContent = `Item ${item + 1}`;
container.appendChild(div);
})
const html_collection = document.getElementsByClassName('item')
console.log(html_collection);
const node_list = document.querySelectorAll('.item')
console.log(node_list);
</script>
</body>
</html>

HTMLCollection
一个仅包含元素节点的动态集合,会随着 DOM 的改变自动更新。常见于通过 document.getElementsByClassName 或 document.getElementsByTagName 获取的集合。

动态集合会带来一些问题,如插入元素导致死循环
btn.onclick = function () {
for (let i = 0; i < html_collection.length; i++) {
const clone = html_collection[i].cloneNode(true)
container.appendChild(clone)
}
}
setInterval(() => {
console.log("111");
}, 200);

NodeList
不同于 HTMLCollection,使用 querySelectorAll 获取的 NodeList 是静态的,dom改变时,并不会影响 NodeList。

使用 childNodes 获取的 NodeList 是动态的,效果同 HTMLCollection。

总结
| 特性 | HTMLCollection | NodeList |
|---|---|---|
| 类型 | 仅包含元素节点 | 可以包含任何类型的节点 |
| 获取方式 | getElementsByClassName, getElementsByTagName | querySelectorAll, childNodes |
| 是否动态 | 动态 | 动态(如 childNodes)或静态(如 querySelectorAll) |
是否支持 forEach | 不支持 | 支持(现代浏览器中) |
| 常用场景 | 获取元素集合 | 获取所有类型的节点集合 |

472

被折叠的 条评论
为什么被折叠?



