JavaScript DOM 核心操作:从内容到节点的实战指南

JavaScript DOM 核心操作:从内容到节点的实战指南
(2025–2026 年仍然最常用的原生 DOM API 写法与现代最佳实践)

以下内容按实际开发中最常用的操作顺序组织,从查找 → 创建 → 修改 → 插入 → 删除 → 属性/样式 → 事件 → 遍历,并标注常见陷阱与现代替代方案。

1. 查找节点(最常用 Top 10 方法)

优先级方法说明返回值现代推荐场景性能备注
1document.querySelector(selector)CSS 选择器,第一个匹配Element 或 null几乎所有场景首选较慢但最灵活
2document.querySelectorAll(selector)所有匹配NodeList(静态)需要多个元素时首选静态快照,不随 DOM 变化
3element.querySelector(…)从某个元素开始查找Element 或 null局部查找,性能更好
4getElementById(id)通过 id,最快Element 或 null有明确 id 时首选最快
5getElementsByClassName(class)通过类名HTMLCollection(动态)旧代码常见,新代码少用动态集合,慎用
6getElementsByTagName(tag)通过标签名HTMLCollection(动态)少用动态集合
7element.closest(selector)向上查找最近的匹配祖先Element 或 null事件委托中非常常用非常实用
8element.matches(selector)判断当前元素是否匹配选择器boolean事件委托判断类型时用
9document.getElementsByName(name)通过 name 属性(表单元素常见)NodeList极少用
10element.children只获取直接子元素(不含文本节点)HTMLCollection常用于只关心元素子节点动态

2025–2026 推荐优先级口诀
id → querySelector → querySelectorAll → closest → children

2. 创建与克隆节点

// 创建元素
const div = document.createElement('div');
div.textContent = 'Hello';
div.className = 'box active';
div.dataset.id = '123';

// 创建文本节点(最常用)
const text = document.createTextNode('纯文本内容');

// 克隆节点(深度克隆最常用)
const clone = original.cloneNode(true);   // true = 深克隆(包含子节点)
const shallow = original.cloneNode(false); // 只克隆自身

3. 修改内容(四种主流方式对比)

方法修改方式是否解析 HTML会清除原有事件监听?推荐场景陷阱
element.innerHTML替换全部内容需要插入 HTML 结构时XSS 风险、性能差、丢失事件
element.textContent纯文本最推荐(安全、高性能)不会解析标签
element.innerText考虑 CSS 显示的文本需要考虑样式隐藏的内容性能最差(会重排)
element.insertAdjacentHTML(position, html)在指定位置插入 HTML否(只影响新内容)局部插入 HTML 时最佳仍需防范 XSS

位置参数(insertAdjacent* 方法通用):

  • 'beforebegin' → 元素前面
  • 'afterbegin' → 元素内部最前面
  • 'beforeend' → 元素内部最后面(最常用)
  • 'afterend' → 元素后面

4. 插入节点(现代最推荐的 5 种方式)

// 方式1:最常用、最直观(2020年后主流)
parent.append(child);           // 末尾添加(可多个)
parent.prepend(child);          // 开头添加
parent.before(child);           // 兄弟前插入
parent.after(child);            // 兄弟后插入

// 方式2:经典但已被取代
parent.appendChild(child);      // 只支持一个节点
parent.insertBefore(newNode, referenceNode);

// 方式3:批量插入(性能最好)
const fragment = document.createDocumentFragment();
fragment.append(div1, div2, div3);   // 不会引起多次重排
parent.appendChild(fragment);        // 一次性插入

5. 删除 & 清空节点

// 删除自身(最常用)
element.remove();                    // 现代首选

// 旧方式(仍兼容)
parent.removeChild(element);

// 清空所有子节点(三种方式对比)
element.innerHTML = '';              // 最快,但有 XSS 风险
while (element.firstChild) {
  element.removeChild(element.firstChild);
}
element.replaceChildren();           // 现代最推荐(2020+),干净、高效

6. 属性操作(attr vs property)

操作类型方法/属性适用场景注意事项
自定义属性element.dataset.xxxdata-* 属性自动驼峰转换
classclassList.add/remove/toggle/contains/replaceclass 操作首选比 className 好用 100 倍
styleelement.style.color = 'red'行内样式优先用 class 代替
通用属性setAttribute / getAttribute / hasAttribute / removeAttributeHTML 属性value、checked、disabled 等特殊
DOM 属性element.value / checked / disabled表单元素的“当前状态”优先使用 DOM 属性而非 getAttribute

7. 事件绑定(现代写法)

// 推荐写法(2020+)
button.addEventListener('click', (e) => {
  // e.currentTarget vs e.target
  // e.preventDefault()
  // e.stopPropagation()
}, { once: true, passive: true });   // 优化选项

// 事件委托(性能最佳)
document.addEventListener('click', (e) => {
  if (e.target.matches('.delete-btn')) {
    // 处理删除
  }
});

// 移除事件(必须是同一个函数引用)
const handler = () => console.log('clicked');
btn.addEventListener('click', handler);
btn.removeEventListener('click', handler);

8. 遍历节点(常用集合对比)

集合类型是否动态包含什么推荐遍历方式
childNodes动态元素 + 文本 + 注释for…of 或 for 循环
children动态只元素for…of 或 for 循环
querySelectorAll静态只元素forEach / for…of
NodeList(部分)部分动态

9. 2025–2026 高频面试 + 真实项目避坑点

  1. innerHTML vs textContent vs insertAdjacentHTML 的 XSS 风险对比
  2. appendChild vs append 的参数差异(append 支持多个 + 字符串)
  3. 事件委托中 e.target vs e.currentTarget vs this 的区别
  4. className = ' ' 会清空所有 class,推荐用 classList
  5. dataset 属性自动驼峰:data-user-id → element.dataset.userId
  6. Fragment 批量插入 vs 多次 appendChild 的性能差距(可达 10–100 倍)
  7. remove() 方法 IE 不支持(需 polyfill 或用 parent.removeChild)
  8. closest() 从自身开始找(包含自己)

需要哪一部分更详细的完整示例代码(如:动态表格增删改查、拖拽排序、事件委托实现 tab 切换、虚拟列表简化版等),或者想看某个具体场景的对比写法?可以告诉我,我再展开。

文章已创建 5245

发表回复

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

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部