news 2026/6/10 14:50:15

一文讲清楚DOM动态观察器MutationObserver的原理和使用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文讲清楚DOM动态观察器MutationObserver的原理和使用场景

一文讲清楚DOM动态观察器MutationObserver的原理和使用场景

1. 引出

  • 前端的童鞋都应该了然一件事,不管是借助框架像vue/react/angular,还是原生开发,就是我们开发来开发去,操作来操作去,其实本质都是在对页面上的HTML内容进行CURD
  • 那既然我们是在对HTML进行CURD,那我们是不是就可以对某个元素进行观察和监听,他是否发生了变化,从而做出相应的业务处理
  • 比如我们在做前端的时候,有时候会加入一下三方框架,比如广告插件,我们原本想的是,你就只干你插件的事,不要给我变动我们页面本来的东西,结果呢,这个广告插件就是耍小聪明,偷偷往页面上插了一个button,引导用户点击跳转,从而实现引流
  • 这可不是我能接受的,靠,我的流量怎么能跑你那边去了呢
  • 又或者这个广告插件特么的可能因为商务关系不太好,给我的站点突然加了一个播放片子的视频,我靠,这可大方了
  • 所以,我们要监测一下,这家伙有没有往页面上加东西,怎么检测呢,就用DOM动态观察器,MutationObserver
  • 他能检测到DOM节点的详细变化,并且允许指定一个回调函数,在变化发生后回调执行,同时可以通过配置项,配置需要监测的内容,如下表
配置项作用
childList监听目标节点的子节点增删(如新增 / 删除
attribute监听目标节点的属性变化,如class/id/src等
characterData监听目标节点的文本内容变化,如textContent
subtree监听目标节点的所有后代节点,开启后,后代节点的变化也会被捕获
attriubteOldValue出发回调时,返回属性变化前的值
characterDataOldCalue触发回调时,返回文本变化前的值
attributeFilter指定监听某下属性,如[src,class]等,减少全量不必要的监听

2. 原理

  • 对设计模式比较了解的童鞋一眼就可以看出来,这是一个典型的观察者模式
  • 观察者:MutationObserver
  • 被观察者:目标DOM节点
  • 触发逻辑:当被观察者的DOM发生指定类型的变化时,浏览器会将变化事件加入到微任务队列,带主线程空闲时,触发观察者的回调函数,传递变化详情
  • 所以说,MutationObserver是异步的,属于微任务,浏览器会把短时间内的多次DOM变化合并为一次回调触发(采用防抖),避免频繁执行回调导致的性能问题
  • 同时,因为MutationObserver是异步的,如果你想在Observer里面访问修改后的DOM状态,比如获取尺寸,需要包裹requestAnimationFrame
  • 原理知道了,具体怎么用呢

3. 使用

  • 分三步
  • 第一步,创建observe
  • 第二步,设置配置项,也就是你需要监听的类型
  • 第三步,绑定目标DOM,开启监听
  • 第四步,触发MutationObserve
  • 第五步,关闭监听
  • 上代码
<divid="target"class="unactive"></div><script>//第一步:创建MutationObserver实例,传入回调函数constobserver=newMutationObserver((mutationList,observer)=>{/** * mutationList是所有触发的DOM变化数组,每个元素都是一个MutationRecord对象 * observer是MutationObserver实例本身,用于关闭实例等操作 */for(constmutationofmutationList){ <
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 9:42:29

【课程设计/毕业设计】基于springboot的课程互助学习系统 “课程答疑、资源共享、组队学习” 一体化平台【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/6 4:58:17

Java计算机毕设之基于springboot的课程互助学习系统课程资料共享、问题答疑、小组协作、学习进度跟踪(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/18 16:13:54

U-Boot中make命令会发生什么?

大家好&#xff0c;我是嵌入式兔哥。在嵌入式开发中&#xff0c;U-Boot的编译构建是核心基础环节&#xff0c;不少朋友对make命令的执行链路、中间文件生成及最终链接过程存在困惑。今天兔哥就带大家逐层拆解&#xff0c;把这些底层逻辑讲透&#xff0c;全是干货&#xff0c;建…

作者头像 李华
网站建设 2026/5/26 20:57:42

饰品商拍提效:AI图生图实现白底图转上身图

饰品电商必看&#xff01;你是不是也被“拍模特上身图”难住了&#xff1f;找模特费钱&#xff0c;自己拍缺场景没氛围&#xff0c;成品还难凸显质感&#xff0c;主图根本没人点&#xff0c;还好挖到AI指图生图工具&#xff01;核心亮点直击痛点&#xff1a;上传饰品白底图&…

作者头像 李华