JavaScript HTML DOM 集合(Collection)


关键要点

  • DOM 集合是存储 DOM 节点或元素的列表对象,主要包括 HTMLCollection 和 NodeList。
  • HTMLCollection 动态更新,只包含元素节点,支持通过索引和名称访问。
  • NodeList 可包含多种节点类型,部分是静态的,部分(如 Node.childNodes)是动态的。
  • 研究表明,这两种集合都不是真正的数组,不能直接使用数组方法。

DOM 集合简介

DOM 集合(Collection)是 JavaScript 中用于管理 HTML 文档中多个节点或元素的对象。它允许开发者通过 JavaScript 访问和操作网页中的多个元素,主要有两种类型:HTMLCollection 和 NodeList。

HTMLCollection 详解

HTMLCollection 是动态集合,只包含元素节点(如 <div><p>)。它通常由 getElementsByTagName()getElementsByClassName() 等方法返回。

  • 访问方式:通过索引(如 collection[0])或 namedItem() 方法(如 collection.namedItem("id"))。
  • 属性length 返回元素数量。
  • 示例:获取所有 <p> 元素:var paragraphs = document.getElementsByTagName("p");
  • 注意:不是数组,不能使用 push()pop() 等方法。

NodeList 详解

NodeList 可以包含元素节点、文本节点等,常见于 querySelectorAll()Node.childNodes

  • 动态性Node.childNodes 是动态的,随 DOM 变化更新;querySelectorAll() 返回的 NodeList 是静态的。
  • 方法:支持 forEach() 等遍历方法。
  • 示例:遍历所有 class 为 “highlight” 的元素:document.querySelectorAll(".highlight").forEach(item => console.log(item));


详细报告

JavaScript HTML DOM 集合(Collection)是现代网页开发中不可或缺的一部分,允许开发者通过 JavaScript 动态操作 HTML 文档中的多个节点或元素。本报告基于多个可靠的中文来源(如 W3School、菜鸟教程、阮一峰的 JavaScript 标准参考教程)提供全面的讲解,涵盖 DOM 集合的基本概念、类型、特点以及实际使用示例。

DOM 集合的基本概念

根据 W3School: JavaScript HTML DOM 集合菜鸟教程: JavaScript HTML DOM 集合,DOM 集合是一种类似数组的对象,用于存储一组 DOM 节点或元素。DOM 集合主要包括两种类型:

  • HTMLCollection:主要包含 HTML 元素节点。
  • NodeList:可以包含任何类型的节点,包括元素节点、文本节点等。

这些集合通常由 DOM 方法返回,例如 document.getElementsByTagName("p") 返回 HTMLCollection,document.querySelectorAll(".class") 返回 NodeList。研究表明,DOM 集合是动态操作网页内容的关键工具,尤其在需要批量处理元素时。

HTMLCollection 的详细说明

HTMLCollection 是 DOM 集合的一种,主要用于存储 HTML 元素节点。它通常由以下方法返回:

  • getElementsByTagName():根据标签名获取元素。
  • getElementsByClassName():根据类名获取元素。
  • document.linksdocument.imagesdocument.forms 等特殊属性。

特点

  • 内容:只包含元素节点(如 <div><p>),不包含文本节点或其他类型节点。
  • 访问方式
  • 通过索引访问:collection[0] 获取第一个元素。
  • 通过 namedItem() 方法使用 id 或 name 属性访问:collection.namedItem("id")
  • 属性
  • length:返回集合中元素的数量,用于遍历或检查集合大小。
  • 动态性:HTMLCollection 是动态集合,随着 DOM 的变化而自动更新。例如,如果你添加或删除一个 <p> 元素,document.getElementsByTagName("p") 的结果会自动反映这些变化。
  • 注意:HTMLCollection 不是真正的数组,因此不能直接使用数组方法如 push()pop() 等。如果需要使用数组方法,可以将集合转换为数组:
  var arrayFromCollection = Array.from(paragraphs);

示例

  • 获取所有 <p> 元素:
  var paragraphs = document.getElementsByTagName("p");
  • 获取 <p> 元素的数量:
  var count = paragraphs.length;
  • 遍历所有 <p> 元素并修改样式:
  for (var i = 0; i < paragraphs.length; i++) {
      paragraphs[i].style.backgroundColor = "red";
  }
  • 获取第一个 <p> 元素:
  var firstParagraph = paragraphs[0];

根据 阮一峰: JavaScript 标准参考教程(DOM 节点),HTMLCollection 支持 item(index)namedItem(name) 方法,分别用于通过索引和名称访问元素。

NodeList 的详细说明

NodeList 是 DOM 集合的另一种形式,可以包含任何类型的节点(元素节点、文本节点等)。它通常由以下方法返回:

  • querySelectorAll():根据 CSS 选择器获取元素。
  • getElementsByName():根据 name 属性获取元素。
  • Node.childNodes:获取某个节点的所有子节点。

特点

  • 内容:可以包含任何类型的节点,包括元素节点、文本节点等。
  • 访问方式
  • 通过索引访问:list[0] 获取第一个节点。
  • 属性
  • length:返回集合中节点的数量。
  • 动态性
  • 静态集合:大多数 NodeList(如 querySelectorAll() 返回的)是不随 DOM 变化而变化的。例如,即使你添加或删除匹配的元素,querySelectorAll(".class") 的结果不会自动更新。
  • 动态集合:只有 Node.childNodes 是动态的,随着 DOM 的变化而更新。例如:
    javascript var children = document.body.childNodes; children.length; // 18 document.body.appendChild(document.createElement('p')); children.length; // 19
  • 方法
  • forEach():遍历集合中的每个节点(现代浏览器支持)。
  • keys()values()entries():返回 ES6 迭代器,用于遍历键、值或键值对,适合与 for...of 循环配合使用。

示例

  • 获取所有 class 为 “highlight” 的元素:
  var highlights = document.querySelectorAll(".highlight");
  • 获取所有 name 为 “username” 的元素:
  var usernames = document.getElementsByName("username");
  • 遍历所有匹配的元素:
  highlights.forEach(function(item) {
      console.log(item);
  });

根据 JavaScript.info: DOM 导航,NodeList 的 forEach() 方法类似于数组的遍历方法,适合处理集合中的每个节点。

HTMLCollection vs NodeList 的对比

以下表格总结了两者的主要区别:

特性HTMLCollectionNodeList
内容只包含元素节点可包含任何类型节点(如文本节点)
动态性总是动态,随 DOM 变化更新部分动态(如 Node.childNodes),部分静态(如 querySelectorAll()
访问方法索引、namedItem()索引
支持方法item()namedItem()forEach()keys()
示例方法getElementsByTagName()querySelectorAll()

使用注意事项

  • 性能考虑:对于大型集合,遍历操作可能较慢,因此在实际开发中应注意性能优化。例如,尽量避免在循环中频繁访问 length 属性。
  • 浏览器兼容性forEach() 方法在现代浏览器中支持良好,但旧版浏览器可能需要降级处理(如使用传统 for 循环)。
  • 内存管理:动态集合(如 HTMLCollection 和 Node.childNodes)会随 DOM 变化而更新,可能会影响性能,特别是在复杂页面中。

实际应用与示例

DOM 集合在实际开发中非常常见,例如:

  • 批量修改样式:遍历所有 <p> 元素,统一设置背景色。
  • 表单处理:获取所有表单输入元素,验证其值。
  • 动态更新:通过 Node.childNodes 实时监控子节点的变化。

根据 Axihe: JavaScript DOM 集合,以下是遍历 HTMLCollection 的示例:

var myCollection = document.getElementsByTagName("p");
for (var i = 0; i < myCollection.length; i++) {
    myCollection[i].style.backgroundColor = "red";
}

总结

JavaScript HTML DOM 集合(Collection)是创建交互式网页的关键机制,主要包括 HTMLCollection 和 NodeList。HTMLCollection 是动态的,只包含元素节点,支持通过索引和名称访问;NodeList 可以包含多种节点类型,部分是静态的,部分是动态的。通过理解和使用 DOM 集合,开发者可以更有效地操作和查询网页中的元素。

关键引用


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注