javascript如何操作DOM_改变网页内容有何技巧【教程】

发布时间 - 2026-01-31 00:00:00    点击率:
最安全高效的方式是优先使用textContent或DOM方法更新文本,避免innerHTML带来的安全隐患与性能问题;需插入富文本时务必先用DOMPurify过滤;批量操作应使用DocumentFragment一次性挂载;监听内容变化推荐MutationObserver而非已弃用的DOMSubtreeModified。

直接改 innerHTML 最快,但不安全;用 textContent 或 DOM 方法更稳妥,尤其涉及用户输入时。

改文本内容:用 textContent 而不是 innerText

innerText 会触发重排、受 CSS 影响(比如 display: none 的元素内容不返回),且在 Firefox 中行为不一致;textContent 是标准、轻量、可预测的选择。

  • 纯文本替换:直接赋值 el.textContent = "新内容"
  • 想保留原有 HTML 结构但只更新文字?别用 innerHTML,先清空再 append 文本节点:el.replaceChildren(document.createTextNode("新内容"))
  • 如果要插入带格式的富文本,且确认来源可信(如 CMS 后台),才考虑 innerHTML,否则必须先用 DOMPurify.sanitize() 过滤

批量插入/替换元素:避免反复操作 innerHTML

每次写 innerHTML += ... 都会触发完整解析 + 重建整个子树,性能差,还会丢失已绑定的事件或表单状态。

  • DocumentFragment 缓存多个新节点,最后一次性挂载:
    const frag = document.createDocumentFragment();
    for (const item of data) {
    const li = document.createElement("li");
    li.textContent = item;
    frag.appendChild(li);
    }
    listEl.appendChild(frag);
  • 已有结构只需局部更新?优先用 replaceWith()before()after() 等现代方法,比删了再建更

    精准
  • 动态列表建议配合 key 思维(哪怕不用框架):给每个项加唯一 data-id,更新前先查 DOM 是否已存在,避免重复创建

监听内容变化:别依赖 DOMSubtreeModified

这个旧事件已被弃用,性能极差,且无法区分是 JS 修改还是用户输入。现代方案是:

  • 对输入类元素(inputtextarea)用 input 事件,它覆盖所有修改方式(键盘、粘贴、自动填充)
  • 需要监控任意元素内容变化?用 MutationObserver,粒度可控:
    const obs = new MutationObserver(() => console.log("内容变了"));
    obs.observe(targetEl, { childList: true, subtree: true, characterData: true });
  • 注意:不要观察整个 document.body,容易误报;尽量缩小目标范围,并在不需要时调用 obs.disconnect()

真正难的不是“怎么改”,而是“改完之后状态是否一致”——比如改了 innerHTML 却忘了重新绑定事件,或者用 textContent 替换了含 input 的片段导致焦点丢失。这些细节不写进代码里,光靠技巧没用。


# css  # javascript  # java  # html  # js  # node  # cms  # app  # firefox  # append 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  ,交易猫的商品怎么发布到网站上去?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在腾讯云服务器上快速搭建个人网站?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  ,网页ppt怎么弄成自己的ppt?  如何在IIS中配置站点IP、端口及主机头?  北京企业网站设计制作公司,北京铁路集团官方网站?  linux top下的 minerd 木马清除方法  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Python图片处理进阶教程_Pillow滤镜与图像增强  微信公众帐号开发教程之图文消息全攻略  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  教你用AI润色文章,让你的文字表达更专业  电商网站制作价格怎么算,网上拍卖流程以及规则?  Python并发异常传播_错误处理解析【教程】  Laravel怎么调用外部API_Laravel Http Client客户端使用  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel用户密码怎么加密_Laravel Hash门面使用教程  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Mybatis 中的insertOrUpdate操作  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  jQuery 常见小例汇总  如何用美橙互联一键搭建多站合一网站?  Python自动化办公教程_ExcelWordPDF批量处理案例  UC浏览器如何设置启动页 UC浏览器启动页设置方法  canvas 画布在主流浏览器中的尺寸限制详细介绍  Angular 表单中正确绑定输入值以确保提交与验证正常工作  iOS发送验证码倒计时应用  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何在企业微信快速生成手机电脑官网?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel如何处理异常和错误?(Handler示例)  如何在VPS电脑上快速搭建网站?  如何在阿里云通过域名搭建网站?