JavaScript中DOM核心操作的实战指南

 更新时间:2026年04月27日 09:28:23   作者:yingjuxia.com  
本文详细介绍了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 切换、虚拟列表简化版等),或者想看某个具体场景的对比写法?可以告诉我,我再展开。

以上就是JavaScript中DOM核心操作的实战指南的详细内容,更多关于JavaScript DOM操作的资料请关注脚本之家其它相关文章!

相关文章

  • ECMAScript5中的对象存取器属性:getter和setter介绍

    ECMAScript5中的对象存取器属性:getter和setter介绍

    这篇文章主要介绍了ECMAScript5中的对象属性存取器:getter和setter介绍,事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都可以被getter和setter方法所取代,这被称之为“存取器属性”,需要的朋友可以参考下
    2014-12-12
  • 如何判别JS中的数据类型?一篇文章教你彻底弄懂typeof和instanceof

    如何判别JS中的数据类型?一篇文章教你彻底弄懂typeof和instanceof

    typeof和instanceof都是JavaScript中用于类型检查的操作符,但它们的工作方式和应用场景有显著不同,这篇文章主要介绍了如何判别JS中的数据类型的相关资料,通过这篇文章可以彻底弄懂typeof和instanceof,需要的朋友可以参考下
    2025-08-08
  • JS中常见编码及加密方式解析

    JS中常见编码及加密方式解析

    这篇文章主要为大家介绍了JS中常见编码及加密方式解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • JavaScript无缝滚动效果的实例代码

    JavaScript无缝滚动效果的实例代码

    本文给大家分享一段实例代码有关js实现无缝滚动效果,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-03-03
  • js实现模拟购物商城案例

    js实现模拟购物商城案例

    这篇文章主要为大家详细介绍了js实现模拟购物商城案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • js实现将选中值累加到文本框的方法

    js实现将选中值累加到文本框的方法

    这篇文章主要介绍了js实现将选中值累加到文本框的方法,涉及javascript动态操作页面元素结点的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-08-08
  • JS引用传递与值传递的区别与用法分析

    JS引用传递与值传递的区别与用法分析

    这篇文章主要介绍了JS引用传递与值传递的区别与用法,结合实例形式较为详细的对比分析了javascript引用传递与值传递的原理、区别、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-06-06
  • 一文带你搞懂JS中六种For循环的使用

    一文带你搞懂JS中六种For循环的使用

    for 循环是出现最早,也是应用最普遍的一个遍历,能够满足绝大多数的遍历。可以遍历 数组、对象、字符串。本文将详细为大家介绍JS中的六种For循环的使用,需要的可以参考一下
    2022-04-04
  • JS实现电话号码的字母组合算法示例

    JS实现电话号码的字母组合算法示例

    这篇文章主要介绍了JS实现电话号码的字母组合算法,结合实例形式分析了javascript组合运算的相关算法原理与操作技巧,需要的朋友可以参考下
    2019-02-02
  • JS代码实现根据时间变换页面背景效果

    JS代码实现根据时间变换页面背景效果

    这篇文章主要介绍了JS代码实现根据时间变换页面背景效果的相关资料,非常不错,具有参考借鉴价值,需要的朋友一起看下吧
    2016-06-06

最新评论