NodeList

NodeList 对象是 节点 的集合,通常由诸如 Node.childNodes 之类的属性和诸如 document.querySelectorAll() 之类的方法返回。

此接口是 尝试创建不可修改的列表,并且仅继续受支持以避免破坏已使用它的代码。现代 API 使用基于 JavaScript 数组 的类型表示列表结构,从而使许多数组方法可用,并同时对其用法施加其他语义(例如,使其项目只读)。

这些历史原因并不意味着您作为开发人员应该避免使用 NodeList。您自己不会创建 NodeList 对象,但您可以从诸如 Document.querySelectorAll() 之类的 API 获取它们,并且这些 API 没有被弃用。但是,请注意与真实数组的语义差异。

虽然 NodeList 不是 Array,但可以使用 forEach() 对其进行迭代。它还可以使用 Array.from() 转换为真正的 Array

动态 NodeList 与静态 NodeList

尽管它们都被认为是 NodeList 对象,但 NodeList 有两种类型:动态静态

动态 NodeList

在某些情况下,NodeList动态的,这意味着 DOM 中的更改会自动更新集合。

例如,Node.childNodes 是动态的

js
const parent = document.getElementById("parent");
let childNodes = parent.childNodes;
console.log(childNodes.length); // let's assume "2"
parent.appendChild(document.createElement("div"));
console.log(childNodes.length); // outputs "3"

静态 NodeList

在其他情况下,NodeList静态的,其中 DOM 中的任何更改都不会影响集合的内容。无处不在的 document.querySelectorAll() 方法返回一个静态 NodeList

在您选择如何迭代 NodeList 中的项目以及是否应缓存列表的 length 时,请牢记这种区别。

实例属性

NodeList.length 只读

NodeList 中的节点数量。

实例方法

NodeList.item()

根据其索引返回列表中的项目,如果索引超出范围,则返回 null

访问 nodeList[i](当 i 超出范围时,它改为返回 undefined)的替代方法。这主要对非 JavaScript DOM 实现有用。

NodeList.entries()

返回一个 迭代器,允许代码遍历集合中包含的所有键/值对。(在本例中,键是从 0 开始的整数,值是节点。)

NodeList.forEach()

对每个 NodeList 元素执行提供的函数一次,并将元素作为参数传递给该函数。

NodeList.keys()

返回一个 迭代器,允许代码遍历集合中包含的所有键/值对的键。(在本例中,键是从 0 开始的整数。)

NodeList.values()

返回一个 迭代器,允许代码遍历集合中包含的所有键/值对的值(节点)。

示例

可以使用 for 循环遍历 NodeList 中的项目

js
for (let i = 0; i < myNodeList.length; i++) {
  let item = myNodeList[i];
}

不要使用 for...in 枚举 NodeList 中的项目,因为它们会枚举其 lengthitem 属性,如果您的脚本假设它只需要处理 元素 对象,则会导致错误。此外,for...in 不保证以任何特定顺序访问属性。

for...of 循环正确地循环遍历 NodeList 对象

js
const list = document.querySelectorAll("input[type=checkbox]");
for (const checkbox of list) {
  checkbox.checked = true;
}

浏览器还支持迭代器方法(forEach())以及 entries()values()keys()

规范

规范
DOM 标准
# interface-nodelist

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。