0

0

javascript如何操作DOM_有哪些高效的节点操作方法

夜晨

夜晨

发布时间:2026-01-09 16:52:02

|

896人浏览过

|

来源于php中文网

原创

不安全,但快;会重写子树、重建DOM、丢失事件监听器和引用;适用纯内容替换场景,避免循环拼接,需用DOMPurify过滤;现代推荐replaceChildren()或append()。

javascript如何操作dom_有哪些高效的节点操作方法

直接修改 innerHTML 安全吗?

不安全,但快。它会完全重写子树,触发浏览器重新解析 HTML、重建 DOM 节点、丢弃已绑定的事件监听器和已有的引用。

常见错误现象:document.getElementById('list').innerHTML += '

  • new
  • ' 看似简洁,实则每次执行都销毁并重建全部
  • ,原有 addEventListener 全失效。

    适用场景:内容完全替换、无交互逻辑、性能敏感且结构简单(如纯文本仪表盘)。

    • 永远避免在循环中拼接字符串再赋值给 innerHTML,易 XSS 且性能差
    • 若必须用,先做 DOMPurify.sanitize() 过滤输入(尤其含用户数据时)
    • 现代替代:用 element.replaceChildren(...) 更可控(见下一条)

    replaceChildren()append() 哪个更高效?

    replaceChildren() 在清空 + 批量插入时更快;append() 更适合增量添加,且支持多种参数类型(节点、字符串、片段)。

    立即学习Java免费学习笔记(深入)”;

    性能差异明显:对 100 个节点批量更新,replaceChildren() 比循环调用 appendChild() 快 3–5 倍(Chrome 120+ 测试),因浏览器可一次性布局计算。

    const list = document.getElementById('list');
    // ✅ 推荐:一次清空并插入全部新节点
    list.replaceChildren(...newItems.map(item => {
      const li = document.createElement('li');
      li.textContent = item;
      return li;
    }));
    
    // ✅ 也推荐:追加单个或多个节点(支持字符串自动转文本节点)
    list.append(newNode, 'plain text', ...moreNodes);
    

    注意:append() 不接受类数组(如 HTMLCollection),需展开;replaceChildren() 传空参即清空,比 innerHTML = '' 更轻量。

    动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
    动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

    动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

    下载

    为什么 DocumentFragment 还值得用?

    在旧版浏览器(如 IE11)或需要精细控制插入时机时,DocumentFragment 仍是离屏构建节点树最稳定的方式——它不触发重排,且所有子节点插入后自动“移动”而非复制。

    容易踩的坑:fragment.appendChild(node) 后,node 从原位置消失(是移动,不是克隆),这点常被忽略导致节点丢失。

    • 现代开发中,replaceChildren()append() 已覆盖大部分场景,DocumentFragment 可作为兜底方案
    • 若需多次复用同一组节点结构(如模板渲染),用 document.createElement('template') + content.cloneNode(true) 更合适
    • 不要对 DocumentFragment 调用 querySelector —— 它不参与样式计算,某些伪类(如 :hover)无效

    动态绑定事件该用委托还是逐个 addEventListener

    对频繁增删子节点的容器(如列表、表格),必须用事件委托;否则每次新增节点都要重复绑定,内存泄漏风险高,且移除节点时容易漏掉清理。

    典型错误:items.forEach(el => el.addEventListener('click', handler)),后续 el.remove() 后监听器仍驻留内存(尤其 handler 是闭包时)。

    const list = document.getElementById('list');
    // ✅ 正确:委托到父容器,用 event.target 判断来源
    list.addEventListener('click', e => {
      if (e.target.matches('li.editable')) {
        handleEdit(e.target);
      }
    });
    

    注意:event.stopPropagation() 会阻断委托链,调试时留意是否意外截断;委托不适用于自定义事件(dispatchEvent)或需要捕获阶段干预的场景。

    复杂点在于:委托要求父容器稳定存在、事件路径清晰;如果容器本身也动态替换(比如整个 #listreplaceChildren() 替换),委托监听器必须绑定在更高层静态节点(如 body 或主内容区)上。

  • 相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    548

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    373

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    730

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    475

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    394

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    990

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    656

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    551

    2023.09.20

    c++主流开发框架汇总
    c++主流开发框架汇总

    本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

    3

    2026.01.09

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 3.5万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.1万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.8万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号