当前位置: 首页 > news >正文

一文讲清楚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){ <
http://www.zskr.cn/news/159543.html

相关文章:

  • 意识、物理规律与宿命论
  • AI提示系统的商业模式的用户分层:提示工程架构师的3个方法
  • ‌测试代码覆盖率:Jacoco配置详解
  • 【课程设计/毕业设计】基于Java的网上宠物店管理系统基于java的宠物用品店系统【附源码、数据库、万字文档】
  • FreeSwtich 闲杂笔记
  • 【计算机毕业设计案例】基于springboot的课程互助学习系统“资源共享 - 协作学习 - 互助答疑(程序+文档+讲解+定制)
  • 【开题答辩全过程】以 共享单车管理系统为例,包含答辩的问题和答案
  • 鸿蒙开发入门:从环境搭建到第一个ArkTS应用,30分钟上手
  • SpringBoot Maven 项目 pom 中的 plugin 插件用法整理 - 教程
  • 英伟达圣诞偷袭,200亿美元收购Groq
  • 汇川H5U结构体编程项目:程序完整,功能块未加密
  • 如何构建一个模型,将企业特定的知识集可视化展示,并可以据此引导用户进行有针对性的提问?
  • 放弃 HarmonyOS 7?OpenHarmony 6.1 LTS 版本适配指南(含老机型兼容技巧)
  • 如何复现论文中的大模型方法并解决实际问题
  • 基于微信小程序的维修服务平台的设计与实现
  • 2025最新!8个AI论文工具测评:本科生写论文还能这么快?
  • 图解23种设计模式应用场景 - 智慧园区
  • 完整教程:bluecms代码审计
  • 以茶叶取小名,萌到想贴贴[特殊字符]
  • 记录一下自己不会的单词,我一定会整明白你们的
  • cs50-linked list笔记
  • OpenAI 格式 API 通用接入说明(含 Cherry Studio 配置教程)
  • 学长亲荐8个AI论文工具,研究生搞定毕业论文+格式规范!
  • 7款免费AI写论文工具实测:知网维普查重一把过,不留AIGC痕迹! - 麟书学长
  • 大数据领域Kappa架构:全面解析与应用场景
  • 第九章 基因工程和基因组学
  • Ty讲解,新手c语言速成教学1
  • 软件测试面试常见问题及答案
  • 第六章 染色体变异
  • Skill Cad 集成到 virtuoso 菜单栏