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

作为前端你还不懂MutationObserver?那Out了

🐱个人主页:不叫猫先生
🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通
📝个人签名:不破不立

🍬目录

  • 🥙前言
  • 🥪一、MutationObserver
    • 1. MutationRecoard监听记录详情
  • 🌮二、MutationObserver实例对象方法
    • 1. observe(node,config)
    • 2. disconnect()
    • 3. takeRecords()
  • 🍔三、案列

🥙前言

为什么突然写MutationObserver呢?最近在写页面水印的时候用到了MutationObserver方法,两者之间有什么联系呢?不用MutationObserver情况下,使用网站的人员可以随意修改DOM就可以把系统作者的版权标识(水印)去掉,然后使用无水印的网站,这显然是违背了系统作者的意愿,那么怎么防止这一操作呢?当然是MutationObserver,它能够监听DOM的变化,根据DOM的变化然后做出相应操作,比如删除水印后,使用MutationObserver监听到了水印的DOM被删除,就会立即生成一个水印,这样就杜绝了上面的情况。

🥪一、MutationObserver

MutationObserver构造函数用来监听DOM的变化,比如节点增加、删除,属性的改变,文本的变动都能监听到。它具有以下特点:

  • 等所有dom操作结束后才触发,可以看成异步
  • 会把dom的变化记录放到数组中进行处理
  • 可以监听所有类型的dom变化,也能指定类型监听

用MutationObserver创建一个createObserve实例, 它会在指定的 DOM 发生变化时被调用。其中MutationObserver构造函数中有两个参数。

  • mutationRecoard:存放所有dom变化的数组
  • observe:观察者实例
const createObserve = new MutationObserver((mutationRecoard,observe)=>{

})

1. MutationRecoard监听记录详情

dom每次变化都会记录在MutationRecoard中,所以它是一个数组类型,MutationRecoard记录了每次DOM变化时的详细信息,具体如下所示:

属性含义
type观察的变动类型(attribute、characterData或者childList)
target发生变动的DOM节点
addedNodes新增的DOM节点
removedNodes删除的DOM节点
previousSibling前一个同级节点,如果没有则返回null
nextSibling下一个同级节点,如果没有则返回null
attributeName发生变动的属性。如果设置了attributeFilter,则只返回预先指定的属性
oldValue变动前的值。这个属性只对attribute和characterData变动有效,如果发生childList变动,则返回null

具体如下图所示:

在这里插入图片描述

🌮二、MutationObserver实例对象方法

1. observe(node,config)

配置 MutationObserver 在 DOM 更改匹配给定选项时,通过其回调函数开始接收通知。有两个参数:

  • node:观察元素的所有节点
  • config:配置项,可以观测指定配置项的变化

配置项的详细属性如下:

属性含义
childList子节点的变动(指新增,删除或者更改)
attributes属性的变动
characterData节点内容或节点文本的变动
subtree布尔值,表示是否将该观察器应用于该节点的所有后代节点
attributeOldValue布尔值,表示观察attributes变动时,是否需要记录变动前的属性值
characterDataOldValue布尔值,表示观察characterData变动时,是否需要记录变动前的值
attributeFilter数组,表示需要观察的特定属性(比如[‘class’,‘src’])

2. disconnect()

阻止 MutationObserver 实例继续接收的通知,直到再次调用其 observe() 方法,该观察者对象包含的回调函数都不会再被调用。

3. takeRecords()

从 MutationObserver 的通知队列中删除所有待处理的记录,并将它们返回到 MutationRecord 对象的新 Array 中。

🍔三、案列

  • 创建一个观察器并传入回调
  • 为观察器配置观察节点
  • 指定观察特定配置的dom变化
  • 执行观察器回调
  • 获取到DOM变化记录
	<div class="content">
		<ui>
			<li class="0">0000000</li>
			<li class="1">1111111</li>
			<li class="2">222222</li>
			<li class="3">33333</li>
			<li class="4">4444</li>
			<li class="5">55555</li>
			<li class="6">6666</li>
			<li class="7">77777</li>
			<li class="8">888888</li>
			<li class="9">99999</li>
		</ui>
	</div>
// 观察器的配置(需要观察什么变动)
const config = { attributes: true, childList: true, subtree: true,characterData:true,characterDataOldValue:true,attributDataOldValue:true};

// 当观察到变动时执行的回调函数
const callback = function(mutationRecoard, observer) {
    // Use traditional 'for loops' for IE 11
    for(let mutation of mutationRecoard) {
        if (mutation.type === 'childList') {
            console.log('A child node has been added or removed.');
        }
        else if (mutation.type === 'attributes') {
            console.log('The ' + mutation.attributeName + ' attribute was modified.');
        }
    }
};

// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback);

// 以上述配置开始观察目标节点
observer.observe(document.getElementsByClassName('content')[0], config);

// 之后,可停止观察
observer.disconnect();

相关文章:

  • 2021 年河南省中等职业教育技能大赛“网络安全”项目比赛任务书解析教程
  • 【目标检测】Faster R-CNN论文代码复现过程解读(含源代码)
  • rpm包常用命令指南
  • 15.前端笔记-CSS-PS切图
  • 网站变灰代码如何让网页变灰
  • 实用调试技巧
  • Python图像处理【3】Python图像处理库应用
  • Android编写一个视频监控App
  • C++语法——map与set的封装原理
  • 搭建gataway鉴权流程
  • Codeforces Round #835 (Div. 4)A.B.C.D.E.F
  • flask入门教程之数据库保存
  • 网站变灰白css
  • Template类创建模板替换字符串
  • MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
  • 4. 路由到控制器 - Laravel从零开始教程
  • css选择器
  • export和import的用法总结
  • GraphQL学习过程应该是这样的
  • HashMap剖析之内部结构
  • Java,console输出实时的转向GUI textbox
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python进阶细节
  • Python学习笔记 字符串拼接
  • sublime配置文件
  • tensorflow学习笔记3——MNIST应用篇
  • 爱情 北京女病人
  • 深度学习在携程攻略社区的应用
  • 正则表达式小结
  • 正则与JS中的正则
  • 阿里云服务器购买完整流程
  • ​如何在iOS手机上查看应用日志
  • #define
  • #QT(一种朴素的计算器实现方法)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $(selector).each()和$.each()的区别
  • (+4)2.2UML建模图
  • (145)光线追踪距离场柔和阴影
  • (C语言)共用体union的用法举例
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot教学评价 毕业设计 641310
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原)Matlab的svmtrain和svmclassify
  • (转)平衡树
  • .NET : 在VS2008中计算代码度量值
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 分布式技术比较
  • .NET 回调、接口回调、 委托
  • @NestedConfigurationProperty 注解用法
  • [BZOJ] 3262: 陌上花开
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.