NodeList 接口 HTMLCollection 接口node
節點都是單個對象,有時須要一種數據結構,可以容納多個節點數組
DOM 提供兩種節點集合,用於容納多個節點:NodeList 和 HTMLCollection數據結構
這兩種集合都屬於接口規範。app
許多 DOM 屬性和方法,返回的結果是 NodeList 實例或 HTMLCollection 實例。函數
主要區別是this
NodeList 能夠包含各類類型的節點spa
HTMLCollection 只能包含 HTML 元素節點。prototype
NodeList 接口code
var children = document.body.childNodes; Array.isArray(children); // false children.length; // 34 children.forEach(console.log); // forEach() 遍歷 NodeList 實例
for (var i = 0; i < children.length; i++) { // for 遍歷 NodeList 實例 var item = children[i]; }
若是 NodeList 實例要使用數組方法,能夠將其轉爲真正的數組orm
var children = document.body.childNodes; var nodeArr = Array.prototype.slice.call(children);
var children = document.body.childNodes; children.length; // 18 document.body.appendChild(document.createElement('p')); children.length; // 19 // 文檔增長一個子節點,NodeList 實例 的 屬性就增長了1childrenlength
document.getElementsByTagName('xxx').length; // 0
var children = document.body.childNodes; children.forEach(function f(item, i, list) { // ... }, this); // forEach方法的第二個參數,用於綁定回調函數內部的this,該參數可省略 // 回調函數f的三個參數依次是 // 當前成員 // 在類數組中的 index // 當前 NodeList 實例。
item
方法。document.body.childNodes.item(0); // item(0)返回第一個成員
document.body.childNodes[0]; // 最爲經常使用
var children = document.body.childNodes; for (var key of children.keys()) { console.log(key); } // 0 // 1 // 2 // ... for (var value of children.values()) { console.log(value); } // #text // <script> // ... for (var entry of children.entries()) { console.log(entry); } // Array [ 0, #text ] // Array [ 1, <script> ] // ...
HTMLCollection 接口
document.links instanceof HTMLCollection // true
// HTML 代碼以下 // <img id="pic" src="http://example.com/foo.jpg"> var pic = document.getElementById('pic'); document.images.pic === pic // true
document.links.length // 18
var c = document.images; var img0 = c.item(0); var img0 = c[0]; // 更經常使用 [ ]
// HTML 代碼以下 // <img id="pic" src="http://example.com/foo.jpg"> var pic = document.getElementById('pic'); document.images.namedItem('pic') === pic // true