nodelist与HTMLCollection

article/2025/10/6 8:43:23

转自:http://www.jianshu.com/p/f6ff5ebe45fd


这篇博客起源于我对一道作业题的思考,在DOM课程中,第二道作业题是:

elem.childrenelem.childNodes的区别?

那么这两者的区别究竟是什么呢?当时我在回答的时候写了这样一段代码(这段代码只得到表面上的答案,是浅层次理解)。

<div id="ct"><p class="para">Lyndon</p><p class="attr">123<span>dozz</span></p>
</div>
<script>var ct = document.getElementById("ct");console.log(ct.children);console.log(ct.childNodes);
</script>

返回的结果是:


可以看出,当我用getElementById方法匹配到id = "ct"的元素节点后

  • ct.children返回的是一个HTMLCollection(图中已用红框标出),其中包含的两个元素是p.para以及p.attr
  • ct.childNodes返回的是一个NodeList(图中已用红框标出),其中包含的元素稍微多些,有5项:text, p.para, text, p.attr, text

每一个元素不断展开,会发现有很多的属性,零零碎碎的,这时候我发现一个比较明显的区别是textContent的不同:

  • HTMLCollection
    • p.paratextContent"Lyndon"
    • p.attrtextContent"123dozz"
  • NodeList
    • texttextContent"↵ "
    • p.paratextContent"Lyndon"
    • texttextContent"↵ "
    • p.attrtextContent"123dozz"
    • texttextContent"↵ "

究竟为何两个方法会返回不一样的结果?老师的课件归纳如下:

两者的不同点在于:

  1. HTMLCollection对象具有namedItem()方法,可以传递id或name获得元素;
  2. HTMLCollection的item()方法和通过属性获取元素(document.forms.f1)可以支持id和name,而NodeList对象只支持id

但是我并没有完全看懂,大概掌握程度是0.6左右,于是我觉得解决这些疑惑的终极方法,应该是去深入了解:HTMLCollectionNodeList本质上的不同


>>> 首先,参考stack overflow上的回答

我翻译了一下Vote数最高的答案:

HTMLCollectionNodeList都是DOM节点的集合,两者都属于Collections范畴,两者的区别在于:

  • 方法略有差异HTMLCollectionNodeList多了一个namedItem方法,其他方法保持一致
  • 包含节点类型不同NodeList可以包含任何节点类型,HTMLCollection只包含元素节点(ElementNode)

Collections的出现场景?

  • 当返回多个节点(如:getElementByTagName)或者得到所有子元素(如:element.childNodes)时,Collections就会出现,这时候就有可能返回HTMLCollection或者NodeList

>>> 其次参考W3的文档(MDN上也有详细解释):

HTMLCollection是以节点为元素的列表,可以凭借索引、节点名称、节点属性来对独立的节点进行访问。HTML DOM中的Collections是实时变动的,当原始文件变化,Collections也会随之发生变化。

  • 属性:length(返回的是列表的长度)
  • 方法1:item(通过序号索引来获取节点,参数是索引值,超过索引值返回null)
    <div id="ct"><p class="para">Lyndon</p><p class="attr">123<span>dozz</span></p><form action="" method="get" name="apply"><input type="text" name="username" placeholder="用户名"><input type="password" name="password" placeholder="密码"></form>
    </div>
    <script>var ct = document.getElementById("ct");var a = ct.children;var b = ct.childNodes;console.log(a);console.log(b);
    </script>

  • 方法2:namedItem(用名字来返回一个节点,首先搜寻是否有匹配的id属性,如果没有就寻找是否有匹配的name属性,如果都没有,返回null)
    <div id="ct"><p class="para">Lyndon</p><p class="attr">123<span>dozz</span></p><form action="" method="get" name="apply"><input type="text" name="username" placeholder="用户名"><input type="password" name="password" placeholder="密码"></form>
    </div>
    <script>var ct = document.getElementById("ct");var a = ct.children;var b = ct.childNodes;console.log(a);console.log(b);
    </script>

NodeList返回节点的有序集合,DOM中的NodeList也是实时变动的

  • 属性:length(列表中节点的数量)
  • 方法:item(返回集合中的元素,如果超过范围返回null)
    <div id="ct"><p class="para">Lyndon</p><p class="attr">123<span>dozz</span></p><form action="" method="get" name="apply"><input type="text" name="username" placeholder="用户名"><input type="password" name="password" placeholder="密码"></form>
    </div>
    <script>var ct = document.getElementById("ct");var a = ct.children;var b = ct.childNodes;console.log(a);console.log(b);
    </script>


>>> Element与Node

到这一步,两者本质上的区别已经差不多分清楚了,那么现在就要进入第二个问题,为什么两个Element属性返回的结果(如:textContent)不一样呢?这里需要感谢同班同学 joyside,他推荐给我一篇文章《Element和Node的区别你造吗?》来理解Element和Node的区别。
文章中参考的是MDN:Node是一个基础类型,document, element, text, comment, DocumentFragment等都继承于Node. 在这篇文章最开始的测试中NodeList结果中有非常多的text,其实element, text, comment都是Node的子类,可以将它们视为:elementNode, textNode以及commentNode.平时在DOM中最常用的Element对象,其本质就是elementNode.
由于Node就是DOM的结构,代码内容经过解析后,Node与Node之间可以插入文本,文章最开头的截图中的"↵ "本质上就是Node之间的空隙,这种空隙的本质是textNode.


>>> 总结

综上所述,进行归纳,并回答文章开头提出的疑问。

  • HTMLCollectionNodeList的共同点显而易见:

    1. 都是类数组对象,都有length属性
    2. 都有共同的方法:item,可以通过item(index)或者item(id)来访问返回结果中的元素
    3. 都是实时变动的(live),document上的更改会反映到相关对象上(例外:document.querySelectorAll返回的NodeList不是实时的)
  • HTMLCollectionNodeList的区别是:

    1. NodeList可以包含任何节点类型,HTMLCollection只包含元素节点(elementNode),elementNode就是HTML中的标签
    2. HTMLCollectionNodeList多一项方法:namedItem,可以通过传递id或name属性来获取节点信息
  • 文章开头的疑问解答:
    文章开头的代码实际上等价于:

    这里是介于node与node之间的textNode
    <div id="ct">这里是介于node与node之间的textNode<p class="para">Lyndon</p>这里是介于node与node之间的textNode<p class="attr">123<span>dozz</span></p>
    这里是介于node与node之间的textNode
    </div>
    <script>var ct = document.getElementById("ct");console.log(ct.children);console.log(ct.childNodes);
    </script>

    由于NodeList包含任何节点类型,ct.childNodes会一并返回textNode, elementNode等,所以最终结果就是由text, p, text, p, text组成的类数组对象,这里的text只是换行符而已。
    由于HTMLCollection仅包含elementNode,因此最终的结果就是由p.para, p.attr组成的类数组对象。当然,由于这里只返回直接的子元素,因此不会出现类数组对象中没有span,如果希望返回结果中有span,这样写就可以了:

    <div id="ct"><p class="para">Lyndon</p><p class="attr"><span>dozz</span></p><span>bilibili</span>
    </div>
    <script>var ct = document.getElementById("ct");console.log(ct.children);console.log(ct.childNodes);

老师在课件中还详细给出了有哪些具体的方法可以获取HTMLCollectionNodeList对象,如果要记住可能比较麻烦,每次在具体情况时参考控制台的输出,得知类型后只需要记住常用的方法区别就可以轻松地进行操作了。


>>> 参考资料

  1. Difference between HTMLCollection, NodeLists, and arrays of objects
  2. Interface NodeList
  3. NodeList and HTMLCollection
  4. Interface HTMLCollection
  5. Element和Node的区别你造吗?


作者:饥人谷_Lyndon
链接:http://www.jianshu.com/p/f6ff5ebe45fd
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/4qOkruKS.shtml

相关文章

HTMLCollection vs NodeList

原文地址&#xff1a;HTMLCollection vs NodeList 作者&#xff1a;HungerLyndon 来源&#xff1a;简书 正文 >>> 引文 这篇博客起源于我对一道作业题的思考&#xff0c;在DOM课程中&#xff0c;第二道作业题是&#xff1a; elem.children和elem.childNodes的区别&…

php nodelist,了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)

本篇文章给大家带来的内容是关于了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。 这三个都是类数组对象。HTMLCollection只包含元素节点&#xff0c;而NodeList包含…

ArrayList转NodeList

废物不多说&#xff0c;直接上代码 let oldList let toNodeList function (arrayOfNodes) {let fragment document.createDocumentFragment();arrayOfNodes.forEach(function (item) {fragment.appendChild(item.cloneNode());});return fragment.childNodes;};let playLisT…

java实现单链表NodeList

目录 一、单链表的概念 二、单链表的实现 1.定义节点类 2.定义单链表 1.属性 2.方法 三、完整实现 一、单链表的概念 单链表的概念&#xff1a;单链表是一种链式存取的数据结构&#xff0c;链表中的数据是以结点来表示的&#xff0c;每个结点的构成&#xff1a;元素(数据…

Node节点、NodeList节点列表

一.NOde节点 属性 className 设置/返回元素的class属性的属性值 innerHTML 设置/返回元素的开始标签与结束标签之间的内容 value 设置/返回文本框与文本域的内容 nextElementSibling 返回下一个紧邻的兄弟节点 previousElementSibling 返回上一个紧邻的兄弟节点 paren…

(一)类数组对象NodeList

NodeList对象的特点&#xff1a; NodeList是一种类数组对象&#xff0c;用于保存一组有序的节点。 可以通过方括号语法来访问NodeList的值&#xff0c;有item方法与length属性。 它并不是Array的实例&#xff0c;没有数组对象的方法。 通过demo简单了解一下NodeList&#xff1a…

javascript 中的nodeList理解

NodeList是一中类数组对象&#xff0c;用于保存一组有序的节点可以通过方括号来访问NodeList的值&#xff0c;他有item()方法与length属性。他并不是Array的实列&#xff0c;没有数组对象的方法。 如何拿到nodeList? var box document.getElementById(box); var nodes box.…

arvix日报0522

1. 3d semantic map Dense Semantic 3D Map Based Long-Term Visual Localization with Hybrid Features

arvix日报0521

1. [paopao] Model Free Calibration of Wheeled Robots Using Gaussian Process 没看懂 2. 西安交大2019icra&#xff0c;介绍一种semantic 3d map方法&#xff0c;基于orb-slam融合语义分割信息融合GPS定位数据提供拓扑地图的方法&#xff0c;用kitti数据库 Visual Semanti…

虚拟现实VR|增强现实AR和人工智能AI结合

1、前言&#xff1a; 近年溺水于CV苦海无法自拔&#xff0c;好久没关注VR或VR引擎了 &#xff0c;记得看2018年Unite Beijing 2018论坛的报道里&#xff0c;Unity AI与机器学习副总裁Danny Lange分享了ML-Agents的新进展。当时稍微关注了下&#xff0c;Danny Lange在加入Unity…

如何将Vufroria 、ARCore和ARkit结合使用

如果想使用Vuforia的卡牌识别&#xff0c;又想加入ARCore和ARKit的平面识别功能。解决办法就是将Vuforia与AR Foudation结合使用。 环境配置 Unity版本&#xff1a;2018.4.2f1以上版本 ARFoundation SDK版本&#xff1a;arfoundation-samples-1.5-preview 下载地址&#xff1a…

ARC

自动引用计数&#xff08;ARC&#xff09;&#xff0c;是一项为Objective - C程序在编译时提供自动内存管理的功能。ARC可以让你把注意力集中在你感兴趣的代码&#xff0c;对象图&#xff0c;和你的应用程序中的对象之间的关系&#xff0c;让你不必再花费精力在retain和release…

ARVR技术 | AR, VR, MR和XR?想搞清楚不?

AR, VR, MR&#xff0c;现在还有XR ?这些缩写是什么?它们代表什么? 让我们快速梳理一下技术术语。 首先&#xff0c;虽然你可能熟悉其中的一些术语&#xff0c;如AR和VR, 但MR和XR对许多人来说仍然是新鲜的术语。 目前的共识是&#xff0c;所有这些互补形式的现实都落在一…

VR与AR简史

点击上方“LiveVideoStack”关注我们 翻译&#xff1a;Alex 技术审校&#xff1a;周昌印 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 VR的历史可以追溯到20世纪60年代。早在1961年&#xff0c;Phlico公司的Charles Comeau和James Bryan就开发了一款头显设备…

【iOS】ARC实现

ARC由以下工具来实现&#xff1a; clang&#xff08;LLVM编译器&#xff09;3.0以上objc4 Objective-C运行时库493.9以上 下面我们&#xff0c;我们将围绕clang汇编输出和objc4库的源代码探究ARC实现 1. __strong修饰符 1.1 赋值给附有__strong修饰符的变量 看下面代码 {…

arvix日报0615

百度的阿波罗开源平台架构 Data Driven Prediction Architecture for Autonomous Driving and its Application on Apollo Platform Kecheng Xu, Xiangquan Xiao, Jinghao Miao, Qi Luo Autonomous Driving vehicles (ADV) are on road with large scales. For safe and eff…

【arVix 2021】Masked Autoencoders Are Scalable Vision Learners(MAE)

文章目录 摘要引言方法maskingMAE encoderMAE decoderReconstruction target.Simple implementation. 总结广泛的影响 摘要 本文证明了遮罩自动编码器(MAE)是一种可扩展的计算机视觉自监督学习器。我们的MAE方法很简单:我们掩盖输入图像的随机补丁&#xff0c;并重建缺失的像素…

Corner Cases for Visual Perception in Automated Driving: Some Guidance on Detection ... (arVix 2021)

Corner Cases for Visual Perception in Automated Driving: Some Guidance on Detection Approaches - 自动驾驶中视觉感知的极端案例&#xff1a;检测方法的一些指导&#xff08;arVix 2021&#xff09; 摘要1. 引言2. 极端案例系统化3. 展示极端案例4. 检测方法的概念5. 关联…

大数据可视化技术栈

作者&#xff1a;微澜潮生 链接&#xff1a;https://www.zhihu.com/question/19710815/answer/18592659 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。

大数据可视化期末复习

大数据可视化期末复习 题型考点范围&#xff1a;选择填空判断知识点简述题编程题绘图和例图 题型 选择题&#xff08;30分 /2’&#xff09;判断题&#xff08;10分 /1’&#xff09;填空题&#xff08;20分 /1’&#xff09;简述题&#xff08;24分 /6’&#xff09;编程题&a…