HTMLCollection对象 与 NodeList对象 以及区别

396 阅读3分钟

HTMLCollection 对象与 NodeList 对象有什么区别?

在选择器中,我们可以知道有些选择器返回HTMLCollection对象,有些返回NodeList对象。

getElementsByClassName():通过类名来查找对应的元素,返回的是一个HTMLCollection对象。

getElementsByName():通过元素的name属性查找对应的元素,返回的是NodeList对象,它是一个类似于数组的结构。

getElementsByTagName(): 通过标签的名称来查找对应的元素,返回的是HTMLCollection对象。

HTMLCollection 对象与 NodeList 对象都是类似数组的结构,有length属性,可以通过call()函数或者是apply()函数转换成数组,使用数组中的函数。

HTMLCollection 对象

HTMLCollection 接口表示一个包含了元素(元素顺序为文档流中的顺序)的通用集合,还提供了从该集合中选择元素的方法和属性。

HTML DOM 中的 HTMLCollection 是即时更新的(live);当其所包含的文档结构发生改变时,它会自动更新。

    <div id="container">
        <div class="bar"></div>
        <div class="foo">
            <div class="inner"></div>
        </div>
    </div>
    <script>
        var main = document.getElementById("container").children;
        console.log(main); //HTMLCollection
        console.log(main.item(0)); //输出:<div class="bar"></div>
        console.log(main.item(1)); // 输出:foo元素
    </script>

image.png

属性

HTMLCollection.length()返回集合当中子元素的数目。

方法

HTMLCollection.item() 根据给定的索引(从0开始),返回具体的节点。如果索引超出了范围,则返回 null

HTMLCollection.namedId() 该函数用来返回一个节点,首先通过id属性去匹配,然后如果没有匹配到则使用name属性匹配,如果还没有匹配到则返回null. 当出现重复的id或者name属性时,只返回匹配到的第一个值。

<form id="form1">
        <input type="text" id="userName" />
        <input type="password" id="password" name="userPwd" />
    </form>
    <script>
        var form1 = document.getElementById("form1").children;
        console.log(form1.item(0));
        console.log(form1.item(1));
        console.log(form1.namedItem("userPwd"));
    </script>

结果如下: image.png

NodeList对象

NodeList 对象是节点的集合。

NodeList 不是一个数组,是一个类似数组的对象 (Like Array Object)。虽然 NodeList 不是一个数组,但是可以使用 forEach() 来迭代。你还可以使用 Array.from() 将其转换为数组。

NodeList对象也具有length属性,返回集合的长度,同样也有item函数,也是通过索引定位子元素的位置。但是NodeList对象没有namedItem方法。在这里就不代码展示了。

区别与练习

同时,当我们对DOM树新增或者是删除一个节点的时候,都会立即的放映在HTMLCollection对象与NodeList对象中。

    <form id="form1">
        用户名<input type="text" id="userName" /> <br />
        用户密码<input type="password" id="password" name="userPwd" />
    </form>
    <script>
        //获取HTMLCollection集合
        var form1Children = document.getElementById("form1").children;
        console.log(form1Children);
        //获取NodeList对象
        var formNodes = document.getElementById("form1").childNodes;
        console.log(formNodes);
    </script>

image.png

HTMLCollection对象与NodeList对象都是类似数组的结构,如果想调用数组中的方法,需要通过call()函数或者是apply()函数,转换为真正的数组后,可以使用数组中的函数。

相同点:

第一:都是类似数组的结构,有length属性,可以通过call()函数或者是apply()函数转换成数组,使用数组中的函数。

第二:都用item函数,通过索引值获取相应的元素。

第三:都是实时的,当在DOM树上添加元素或者是删除元素,都会立即反应到HTMLCollection对象和NodeList对象上。

不同点:

第一:HTMLCollection对象中,有namedItem()函数,而NodeList对象中没有.

第二:NodeList对象中存储的是元素节点的集合,包括元素,以及节点,例如text文本节点,而HTMLCollection对象中只包含了元素的集合。