📅  最后修改于: 2023-12-03 15:00:31.558000             🧑  作者: Mango
DOM-NodeList
对象代表了由文档中选择元素所返回的节点集合,是一个类数组对象。相比于单个元素对象,NodeList
对象可以包含多个元素并提供了一些方便的方法。
获取NodeList
对象的方式通常有以下两种:
querySelectorAll
方法querySelectorAll
方法可以按照CSS选择器的规则选择文档中的元素,并返回一个NodeList
对象,如下:
const elements = document.querySelectorAll('p');
console.log(elements); // NodeList(3) [p, p, p]
通过原生的DOM方法选择元素时,如果选中的元素有多个,那么获取到的就是一个NodeList
对象。举个例子:
const container = document.getElementsByClassName('container')[0];
const items = container.getElementsByTagName('li');
console.log(items); // NodeList(3) [li, li, li]
与数组类似,NodeList
对象也有length
属性,表示对象中元素的个数。
console.log(elements.length); // 3
NodeList
对象还有一个item
方法,用于返回指定索引位置的元素。索引值从0开始。
console.log(elements.item(0)); // <p id="p1">Hello world.</p>
注:item
方法跟数组的取值方法很类似,但还有一个差异就是当传入的参数为空值或undefined时,item
方法会返回null
,而数组的取值则是返回undefined。
由于NodeList
对象是类数组对象,没有原生的forEach方法,但是我们可以使用Array原型链上的forEach
方法来对所有元素进行遍历:
Array.prototype.forEach.call(elements, function(element, index) {
console.log(element.innerHTML, index);
});
NodeList
对象不仅可以遍历元素,还支持ES2015引入的 keys
、values
、entries
方法,基本使用方法跟 Array
类似,返回一个迭代器对象。
const iterator = elements.keys();
console.log(iterator.next()); // {value: 0, done: false}
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: undefined, done: true,}
如果想使用ES6的forEach,map或filter等方法,可以通过将NodeList
对象转换为数组,再使用数组上的方法来实现:
const arr = Array.prototype.slice.call(elements);
arr.forEach((item, index) => {
console.log(item.innerHTML, index);
});
NodeList
对象是一个Web开发中常见的容器,它通常代表了一些元素的集合,提供了方便的方法来操作集合中的所有元素。虽然它本身并不是数组,但是可以通过一些技巧让它具备类似数组的所有特性。有了这些特性,我们可以更轻松地处理文档中的一些元素。