• home > webfront > SGML > xml >

    再谈BOM和DOM(8):NodeList与HTMLCollection的区别

    Author:zhoulujun Date:

    NodeListNodeList 对象是Node节点的集合——只包含 Node 节点的集合!NodeList 常用于 DOM(文档对象模型)操作中,例如使用 querySe

    NodeList

    NodeList 对象是Node节点的集合——只包含 Node 节点的集合!

    NodeList 常用于 DOM(文档对象模型)操作中,例如使用 querySelectorAll() 方法返回的结果。

    详见:https://developer.mozilla.org/zh-CN/docs/Web/API/NodeList


    HTMLCollection

    HTMLCollection 只包含元素节点(Element 节点)

    详见:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCollection


    NodeList VS HTMLCollection

    需要注意的是,HTMLCollection NodeList 是动态的,也就是说,如果文档结构发生变化,NodeList 会自动更新以反映最新的状态。MutationObserver接口可以观察整个文档、DOM 树的一部分,或某个元素被修改时异步执行回调。

    • NodeList集合主要是Node节点的集合

    • HTMLCollection集合主要是Element元素节点的集合。

    Node节点共有12种,Element元素节点只是其中一种。

    nodeType

    nodeType属性返回节点类型的常数值。不同的类型对应不同的常数值,12种类型分别对应1到12的常数值

    元素节点              Node.ELEMENT_NODE(1)
    属性节点              Node.ATTRIBUTE_NODE(2)
    文本节点              Node.TEXT_NODE(3)
    CDATA节点             Node.CDATA_SECTION_NODE(4)
    实体引用名称节点       Node.ENTRY_REFERENCE_NODE(5)
    实体名称节点          Node.ENTITY_NODE(6)
    处理指令节点          Node.PROCESSING_INSTRUCTION_NODE(7)
    注释节点              Node.COMMENT_NODE(8)
    文档节点              Node.DOCUMENT_NODE(9)
    文档类型节点          Node.DOCUMENT_TYPE_NODE(10)
    文档片段节点          Node.DOCUMENT_FRAGMENT_NODE(11)
    DTD声明节点            Node.NOTATION_NODE(12)

    详见:再谈BOM和DOM(2):DOM节点层次/属性/选择器/节点关系/操作详解》,


    以下是 JavaScript 中返回 NodeList 和 HTMLCollection 的一些常用操作:

    返回 NodeList 的操作:

    1. document.querySelectorAll(selector):返回文档中匹配指定 CSS 选择器的所有元素的 NodeList。

    2. element.querySelectorAll(selector):返回指定元素的子元素中匹配指定 CSS 选择器的所有元素的 NodeList。

      1. document.querySelector(selector):querySelector 方法返回的是一个 Node 对象(通常为 Element),而不是 NodeList 或 HTMLCollection。

    3. Node.childNodes:返回指定节点的所有子节点的 NodeList。

    4. document.getElementsByTagNameNS(namespaceURI, localName):返回具有指定命名空间和本地名称的所有元素的 NodeList。

    5. Node.getElementsByTagName(name):返回具有指定标签名的所有后代元素的 NodeList。

    6. Node.getElementsByClassName(className):返回具有指定类名的所有后代元素的 NodeList。

    返回 HTMLCollection 的操作:

    1. document.getElementsByTagName(name):返回具有指定标签名的所有元素的 HTMLCollection。

    2. document.getElementsByClassName(className):返回具有指定类名的所有元素的 HTMLCollection。

    3. document.getElementsByName(name):返回具有指定名称的所有元素的 HTMLCollection。

    4. element.getElementsByTagName(name):返回指定元素的子元素中具有指定标签名的所有元素的 HTMLCollection。

    5. element.getElementsByClassName(className):返回指定元素的子元素中具有指定类名的所有元素的 HTMLCollection。

    6. formElement.elements:返回表单元素中的所有表单控件的 HTMLCollection。

    7. selectElement.options:返回 select 元素中的所有 option 元素的 HTMLCollection。

    8. tableElement.rows:返回表格元素中的所有行元素的 HTMLCollection。

    9. tableSectionElement.rows:返回表格节(thead、tbody 或 tfoot)中的所有行元素的 HTMLCollection。

    10. tableRowElement.cells:返回表格行元素中的所有单元格元素的 HTMLCollection。


    getElementsByTagName 和 getElementsByClassName 方法在不同上下文中返回 NodeList 和 HTMLCollection,它们的区别主要在于返回的集合类型和使用场景。

    getElementsByTagName 和 getElementsByClassName 在 document 上下文中使用时,返回 HTMLCollection:

    // 返回 HTMLCollection
    const allDivs = document.getElementsByTagName("div");
    const allClassElements = document.getElementsByClassName("my-class");

    getElementsByTagName 和 getElementsByClassName 在元素上下文中使用时,返回 NodeList:

    const container = document.getElementById("container");
    
    // 返回 NodeList
    const containerDivs = container.getElementsByTagName("div");
    const containerClassElements = container.getElementsByClassName("my-class");


    参考文章:

    深入理解javascript中的动态集合——NodeList、HTMLCollection和NamedNodeMap https://www.cnblogs.com/xiaohuochai/p/5827389.html

    深入理解DOM节点类型第一篇——12种DOM节点类型概述 https://www.cnblogs.com/xiaohuochai/p/5785189.html




    转载本站文章《再谈BOM和DOM(8):NodeList与HTMLCollection的区别》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/SGML/xml/2021_0511_9099.html