news 2026/4/23 11:04:09

一文讲清楚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/4/23 12:15:24

云原生密钥管理:Sealed Secrets与Vault

在云原生环境中&#xff0c;密钥管理是保障系统安全的关键环节。密钥就像是一把打开系统资源的“钥匙”&#xff0c;如果管理不当&#xff0c;就会面临密钥泄露、管理失败等严重问题&#xff0c;从而威胁整个云原生系统的安全。而 Sealed Secrets 和 Vault 就是解决这些问题的有…

作者头像 李华
网站建设 2026/4/18 5:27:24

基于深度学习的电动车头盔佩戴检测系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

作者头像 李华
网站建设 2026/4/18 7:29:24

AI应用架构师如何优化增量学习应用实践

AI应用架构师如何优化增量学习应用实践 一、引入与连接&#xff1a;当AI模型遇上“实时数据洪流” 凌晨3点&#xff0c;某电商AI应用架构师李明盯着监控大屏上的“推荐准确率”曲线——这条原本平稳的曲线&#xff0c;正随着凌晨促销活动的开启快速下滑。原因很简单&#xff1a…

作者头像 李华
网站建设 2026/4/18 4:45:28

Java毕设选题推荐:基于springboot+vue的校园学习互助系统基于springboot的课程互助学习系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/4/13 15:43:52

提示工程架构师必读:需求分析的3大黄金法则

提示工程架构师必读:需求分析的3大黄金法则 一、引入与连接:为什么需求分析是提示工程的“地基”? 一个让我印象深刻的痛点场景 去年,我帮一家教育机构做AI课件生成的提示工程。客户一开始说:“我们需要一个能生成数学课课件的提示。” 我按照常规思路写了提示:“生成…

作者头像 李华
网站建设 2026/4/18 7:48:34

【开题答辩全过程】以 河金新生报到管理APP为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华