JavaScript HTML DOM 集合(Collection)(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Web 开发中,JavaScript 与 HTML 的交互是构建动态页面的核心能力之一。而 JavaScript HTML DOM 集合(Collection) 正是连接这两者的关键桥梁。无论是需要一次性操作多个元素,还是根据用户行为动态更新页面内容,DOM 集合都扮演着不可或缺的角色。本文将从基础概念出发,逐步解析其特性、应用场景及常见问题,并通过案例帮助读者掌握这一工具的使用技巧。
一、什么是 DOM 集合?
1.1 DOM 的基础概念
DOM(Document Object Model,文档对象模型) 将 HTML 文档表示为树形结构,每个节点(如标签、文本等)对应一个对象。而 DOM 集合则是指通过 JavaScript 获取到的一组 DOM 节点的集合,例如页面中所有 <div>
元素或具有相同类名的元素。
可以将 DOM 集合想象为一个“动态书架”:
- 书架上的每一本书对应一个 DOM 节点;
- 书架本身可以随时增减书籍(即动态更新元素);
- 书籍的排列顺序遵循文档的结构。
1.2 两种常见集合类型
JavaScript 中的 DOM 集合主要分为两类:
-
NodeList:
- 通过
document.querySelectorAll()
等方法返回; - 支持
length
属性和索引访问(如nodes[0]
),但不直接具备数组方法(如map()
)。
- 通过
-
HTMLCollection:
- 通过
document.getElementsByTagName()
或document.getElementsByClassName()
等方法返回; - 动态更新,集合内容会随页面元素变化而实时变化。
- 通过
示例代码:
// 获取所有 <div> 元素,返回 NodeList
const divs = document.querySelectorAll("div");
// 获取所有 class 为 "item" 的元素,返回 HTMLCollection
const items = document.getElementsByClassName("item");
二、如何获取和操作 DOM 集合
2.1 常用获取方法
以下方法可返回不同类型的集合:
| 方法 | 返回类型 | 特点 |
|------|----------|------|
| document.querySelectorAll(selector)
| NodeList | 支持 CSS 选择器,静态集合(不随 DOM 变化更新) |
| document.getElementsByClassName(name)
| HTMLCollection | 根据类名筛选,动态更新 |
| document.getElementsByTagName(name)
| HTMLCollection | 根据标签名筛选,动态更新 |
| document.getElementsByName(name)
| NodeList | 根据 name
属性筛选 |
示例:
// 通过类名获取动态集合
const listItems = document.getElementsByClassName("list-item");
listItems[0].textContent = "第一个元素内容已修改";
2.2 遍历集合的技巧
由于 DOM 集合并非真正的数组,直接使用 forEach()
会报错。以下是两种常见遍历方法:
2.2.1 使用 for
循环
const buttons = document.querySelectorAll("button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].addEventListener("click", function() {
console.log(`按钮 ${i + 1} 被点击`);
});
}
2.2.2 转换为数组后使用数组方法
// 使用 Array.from() 或扩展运算符
const items = document.querySelectorAll(".item");
Array.from(items).forEach(item => {
item.style.backgroundColor = "lightblue";
});
三、DOM 集合的动态特性与注意事项
3.1 动态更新的特性
HTMLCollection 是“活集合”,会实时反映页面元素的变化。例如:
const divs = document.getElementsByTagName("div");
// 在页面中新增一个 <div> 元素后
console.log(divs.length); // 会自动增加
而 NodeList 则是“静态集合”,除非重新调用查询方法,否则不会更新。
3.2 常见误区与解决方案
误区 1:误用集合作为数组
// 错误示例:尝试直接调用数组方法
document.querySelectorAll("p").map(p => p.textContent); // 报错!
// 正确做法:转换为数组
Array.from(document.querySelectorAll("p")).map(p => p.textContent);
误区 2:忽略索引越界
const items = document.getElementsByClassName("non-existent"); // 无匹配元素时
console.log(items[0]); // 可能返回 undefined,需判断长度
3.3 性能优化建议
- 避免频繁查询:将集合存储在变量中复用,而非重复调用
querySelectorAll()
; - 谨慎使用动态集合:若需固定元素列表,建议用
Array.from()
转换为静态数组。
四、实战案例:动态表格操作
4.1 案例目标
实现一个可动态添加、删除行的表格,并通过 DOM 集合批量更新样式:
4.1.1 HTML 结构
<table id="myTable">
<tr><td>行1</td></tr>
<tr><td>行2</td></tr>
</table>
<button onclick="addRow()">添加行</button>
<button onclick="highlightRows()">高亮所有行</button>
4.1.2 JavaScript 实现
function addRow() {
const table = document.getElementById("myTable");
const newRow = table.insertRow(-1);
newRow.innerHTML = "<td>新行</td>";
}
function highlightRows() {
// 获取所有 <tr> 元素,转换为数组后操作
const rows = Array.from(document.querySelectorAll("tr"));
rows.forEach(row => {
row.style.backgroundColor = "yellow";
});
}
4.2 案例解析
- 动态操作:通过
insertRow()
方法实时修改 DOM,集合rows
会自动包含新增的行; - 批量操作:利用数组方法简化样式更新逻辑;
- 事件绑定:通过按钮的
onclick
属性直接触发函数,体现 DOM 集合与交互的结合。
五、进阶技巧:结合现代 JavaScript
5.1 使用 for...of
遍历
ES6 引入的 for...of
循环可直接作用于 NodeList:
const paragraphs = document.querySelectorAll("p");
for (const para of paragraphs) {
para.style.color = "red";
}
5.2 结合 CSS 选择器优化查询
利用更精准的 CSS 选择器减少遍历范围:
// 直接获取 class 为 "active" 的 <li> 元素
const activeItems = document.querySelectorAll("li.active");
结论
掌握 JavaScript HTML DOM 集合 的使用,是 Web 开发者提升效率的关键一步。通过本文的讲解与案例,读者应能理解集合的类型差异、动态特性及常见操作方法。无论是构建响应式 UI 还是优化性能,DOM 集合都提供了灵活且强大的支持。建议读者通过实际项目练习,逐步熟悉其特性,从而在开发中游刃有余。
延伸思考:随着 Web API 的发展,如
Element.closest()
、Element.matches()
等方法的出现,DOM 操作的边界不断扩展。未来,结合 CSS 选择器与集合操作的组合,将进一步简化复杂场景的实现。