NodeList

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

NodeList 物件是 節點 的集合,通常由 Node.childNodes 等屬性和 document.querySelectorAll() 等方法返回。

這個介面曾是 建立不可修改列表的嘗試,並且至今仍然被支援,以免破壞現有程式碼。現代 API 使用基於 JavaScript 陣列 的型別來表示列表結構,從而提供了許多陣列方法,同時對其使用施加了額外的語義(例如,使其項只讀)。

這些歷史原因並不意味著開發者應該避免使用 NodeList。你不會自己建立 NodeList 物件,而是從 Document.querySelectorAll() 等 API 獲取它們,這些 API 並未被棄用。但是,要注意它與真實陣列的語義差異。

雖然 NodeList 不是 Array,但可以使用 forEach() 迭代它。也可以使用 Array.from() 將其轉換為真實的 Array

即時 NodeLists 與靜態 NodeLists

儘管它們都被視為 NodeList 物件,但 NodeList 有 2 種變體:即時 (live)靜態 (static)

在大多數情況下,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靜態的,DOM 的任何更改都不會影響集合的內容。無處不在的 document.querySelectorAll() 方法是唯一返回靜態 NodeList 的 API。

在選擇如何迭代 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 屬性,如果你的指令碼假設只需要處理 element 物件,則會導致錯誤。此外,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

瀏覽器相容性