目录
NodeList
打印结果
entries():
forEach():
item():
keys():
values():
HTMLCollection
首页 web前端 js教程 NodeList 和 HTMLCollection 和 Array的解析

NodeList 和 HTMLCollection 和 Array的解析

Jul 07, 2018 pm 05:30 PM
html html5 javascript

这篇文章主要介绍了关于NodeList 和 HTMLCollection 和 Array的解析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

Array,NodeList, HTMLCollection这三个概念和它们之间的关系有很多做了几年前端的同学都搞不清楚,经常遇到但是又感觉很陌生,剪不断理还乱的感觉。今天咱们就来理清这三个东西。

对于Array大家差不多都能弄明白,但是HTMLCollectio、NodeList和Array的关系好像总是很暧昧,有一点像但是又不那么像,可能是我比较笨,但是真的被它们弄得很头疼啊,所以今天下决心必须弄懂它们。

咱们先不管那么多概念和定义,先来看看这三个东西到底长什么样。咱们先创建一个html文件,里面就放三个嵌套的p:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <p class="test-p">
        p1
        <p class="test-p">
            p2
            <p class="test-p">
                p3
            </p>
        </p>
    </p>
</body>
</html>
登录后复制

NodeList

首先让我们来研究一下NodeList,在浏览器中打开这个html文件,打开控制台输入:

document.querySelectorAll('p')
登录后复制
打印结果

3696845513-5b3e460ea0b00_articlex[1].jpg

我们发现返回的NodeList中包含这三个p。展开NodeList的__proto__属性后发现,NodeList继承于一个NodeList对象,而这个NodeList对象又继承于Object对象。

NodeList除了length属性外还有其他5个方法(method),分别是entries, forEach, item, keys, values,这五个方法都是干什么用的呢?用一遍就知道:

entries():

调用entries方法会返回一个iterator(迭代器),关于iterator/iterable可以参见MDN,简单点说就是返回了一个可以遍历的对象,而这个对象实现了iterable protocal,所以需要用for...of遍历,所以我们可以:

var ps = document.querySelectorAll('p');
for(var item of ps.entries()){
    console.log(item);
}
登录后复制

结果返回了三个包含三个p对象数组(为什么不是三个key-value pair?),如图:

1657990056-5b3e460e94256_articlex[1].jpg

forEach():

forEach的用法和Array的forEach用法一样,都是用于遍历集合元素:

var ps = document.querySelectorAll('p');
ps.forEach(function (el, index, list) {
    console.log(el);
});
登录后复制
item():

item()用于从NodeList中获取单个节点元素:

var ps = document.querySelectorAll('p');
console.log(ps.item(0));
登录后复制

打印结果:
2466365985-5b3e460e7935f_articlex[1].jpg

keys():

返回一个iterator用于遍历NodeList的key:

var ps = document.querySelectorAll('p');
for (var key of list.keys()) {
    console.log(key);
}
登录后复制

打印结果:
4100756640-5b3e460e29612_articlex[1].jpg

values():

keys()类似,返回一个iterator用于遍历NodeList的value,即html元素:

var ps = document.querySelectorAll('p');
for (var value of ps.values()) {
    console.log(value);
}
登录后复制

打印结果:
2894857841-5b3e460e51647_articlex[1].jpg

通过对NodeList的研究我们发现,NodeList和Array没有继承关系,但是都有length属性和forEach方法,而且拥有几个特有的方法,主要都是用来遍历和取值用的。

HTMLCollection

认识了NodeList,我们再来认识一下HTMLCollection,同样我们先获取到一个HTMLCollection,在控制台中输入并执行:

document.getElementsByTagName('p')
登录后复制

打印结果:

1101730131-5b3e460e5f45c_articlex[1].jpg

可以看到得到的HTMLCollection继承于一个HTMLCollection对象,而HTMLCollection又直接继承于Object对象,所以它和NodeList是平级的。HTMLCollection和NodeList一样包含了查询得到的html元素,length属性和item方法,但没有NodeList的entries, forEach, keys, values这四个方法,但是又多了一个namedItem(根据id和name筛选元素)方法...

看到了NodeList和HTMLCollection这两个家伙的真容,我们很好奇这两个有很多相似又相互独立的家伙是怎么被发明出来的呢?什么情况下得到的是NodeList,什么情况是HTMLCollection呢?

MDN上是这么介绍HTMLCollection的:

Note: This interface is called HTMLCollection for historical reasons (before the modern DOM, collections implementing this interface could only have HTML elements as their items).

翻译一下就是:
之所以叫它HTMLCollection是因为某些历史原因,在新一代DOM出现之前,实现HTMLCollection这个接口的集合只包含HTML元素,所以命名为HTMLCollection。

我们知道DOM节点(node)不光包含HTML元素,还包含text node(字符节点)和comment(注释),既然HTMLCollection只包含HTML元素,那NodeList是不是会包含所有类型的DOM节点呢,我们来试验一下,先写一段html:

<p class="parent">
    this is patent content
    <p class="child">
        this is child content
    </p>
    <!-- this is comment -->
</p>
登录后复制

然后执行:

var parent = document.querySelector('.parent');
console.log(parent.childNodes);
登录后复制

打印结果:

371349160-5b3e460e2e8f7_articlex[1].jpg

我们看到childNodes返回的是第一个p下面的所有DOM节点,包含3个text node(其中两个是换行符),一个子p,一个comment。这证实了我们对NodeList的猜想。

我们再看一下HTMLCollection,执行:

var parent = document.querySelector('.parent');
console.log(parent.children);
登录后复制

打印结果:

817562099-5b3e460e41d00_articlex[1].jpg

只包含了子p,也验证了MDN上的说法。

至于parent即有childNodes属性,又有children属性呢?

因为parent即是一个Node对象(拥有childNodes属性),又因为它有子元素所以它又是一个ParentNode对象(拥有children属性)。

至此,我们对NodeList和HTMLCollection应该有一个比较全面的认识,总结一下就是HTMLCollection是比较早期的模型,只能包含HTML元素,早期就有的接口如document.getElementsByClassName, document.getElementsByTagName返回的就是HTMLCollection。NodeList是比较新的模型,相比HTMLCollection更加完善,不光有HTML元素,还有text节点和comment。比较新的接口如document.querySelectorAll返回的就是NodeList。

关于NodeList,HTMLCollection和Array的关系,就是长得像,有个别相似的功能,但是是完全不一样的东西。

当然关于HTMLCollection和NodeList的故事还没有讲完,因为它们有时候是live(活的?动态的?),有时候是not live(死的?静态的?),关于这个话题,之后的文章再详细分析。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

JavaScript创建对象的四种方式

浏览器与NodeJS的EventLoop异同以及部分机制

以上是NodeList 和 HTMLCollection 和 Array的解析的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

See all articles