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

news2024/11/24 9:10:18

🐱个人主页:不叫猫先生
🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏: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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty(一)- Netty与BIO、NIO、AIO介绍

文章目录一、Netty的介绍二、Netty的应用场景1. 互联网行业2. 游戏行业3. 大数据领域三、I/O模型1. Java BIO&#xff08;1&#xff09;Java BIO 基本介绍&#xff08;2&#xff09;Java BIO 工作机制&#xff08;3&#xff09;Java BIO 应用实例&#xff08;4&#xff09;Java…

css如何快速将网站设置为灰色背景

突然想起写这篇文章是因为&#xff0c;公司的产品大早上打电话说&#xff1a;“赶紧&#xff0c;业务刚通知&#xff0c;我们的官网、小程序、公众号的首页需要变为灰色背景&#xff0c;最好在10点半之前上线”。当时心有千般不愿&#xff0c;但最后生活压倒我坚硬的脊梁。哈哈…

关于《web课程设计》网页设计 用html css做一个漂亮的网站 仿新浪微博个人主页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

C语言用高斯消元法求行列式

目录 数学原理 程序设计 整体流程与代码 测试函数 测试结果 数学原理 高斯消元法求行列式&#xff1a;利用初等行变换&#xff0c;化为上三角行列式&#xff0c;求其主对角线的乘积 行列式的初等行变换&#xff1a; 1&#xff09;换行变换&#xff1a;交换两行&#xf…

静态路由配置案例

静态路由配置案例配置静态路由原理命令&#xff1a;案例&#xff1a;最后结果&#xff1a;配置静态路由原理命令&#xff1a; [Huawei]ip route-static 来源ip 子网掩码 去向ip [Huawei]ip route-static 192.168.20.1 255.255.255.0 192.168.1.2 案例&#xff1a; pc1,pc2,a…

世界杯里的数学知识

一、前言 2022 年卡塔尔世界杯足球赛已经开幕&#xff0c;这是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。除此之外&#xff0c;卡塔尔世界杯还是首次在北半球冬季举行、首次由从未进过世界杯决赛圈的国家举办的世界杯足球赛。世界杯足球赛里…

凌玮科技IPO注册生效:曾踩雷理财损失2000万元,胡颖妮为董事长

11月30日&#xff0c;广州凌玮科技股份有限公司&#xff08;下称“凌玮科技”&#xff09;在深圳证券交易所创业板递交招股书&#xff08;注册稿&#xff09;。相较于此前招股书&#xff0c;凌玮科技补充披露了截至2022年9月30日的财务数据等信息&#xff0c;并对2022年度的业绩…

SimCSE:对比学习,只需要Dropout

要说2021年上半年NLP最火的论文&#xff0c;想必非《SimCSE: Simple Contrastive Learning of Sentence Embeddings》莫属。SimCSE的全称是Simple Contrastive Sentence Embedding Sentence Embedding Sentence Embedding一直是NLP领域的一个热门问题&#xff0c;主要是因为其…

独家 | AI是如何帮助创造看起来和听起来都和我们一样的仿真数码人的

作者&#xff1a;Anthony Green翻译&#xff1a;顾伟嵩 校对&#xff1a;赵茹萱本文约6000字&#xff0c;建议阅读14分钟 由AI驱动的仿真数码人正在从事娱乐、执法等工作。图来源于ERICA SNYDER/MITTR | UNSPLASH仿真数码双胞胎捕获了真实人类的外表和表情。这些复制品越来越多…

科技云报道:从百度智能云的探索,看懂边缘云的过去和未来

科技云报道原创。 布莱恩阿瑟在《技术的本质》一书中写道&#xff0c;“技术是一个异常美丽的主题&#xff0c;它不动声色地创造了财富&#xff0c;成就了经济的繁荣&#xff0c;改变了人类的生存方式。” 五年前&#xff0c;人们还不会在地铁公交上看视频&#xff0c;因为视频…

obsidian和zotero联动

前言 看了好多obsidian和zotero联动的视频和教程&#xff0c;终于还是下手了。 obsidian和zotero之所有能够完美联动&#xff0c;很大程度上建立在这两个软件都有这活跃的第三方插件市场&#xff0c;只要肯花功夫挖掘&#xff0c;我相信是能玩出花来的。 网上的多数联动是基…

如何在R语言中建立六边形矩阵热图heatmap可视化

原文链接&#xff1a;http://tecdat.cn/?p18879这是一个六边形热图可视化程序&#xff0c;主要用到的知识RColorBrewer&#xff0c;fields,也就是R中的可视化绘图库&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。本文希望SOM的结果以六边形热图可视化。让我…

JMeter入门教程(6) --脚本添加

文章目录1.添加线程组2.添加HTTP Cookie管理器3.添加HTTP请求默认值4.添加HTTP请求5.添加查看结果树1.添加线程组 1.创建JMeter测试计划的第一步就是添加线程组测试元件。线程组会告诉JMeter需要模拟的并发用户数&#xff0c;以及并发用户发送请求的频率和数目。 要添加线程组…

程序过程分析——从编译到执行

汇编源程序 mov ax,4c00H int 21H 这两条指令可以实现程序返回的功能。 编译 使用微软的masm5.0汇编编译器,文件名为masm.exe。 在编译的过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.Ist)、交叉引用文件(.erf),这3个输…

【vue项目部署CSS失效】VUE部署后css样式加载无效和失效多种情况解决方案

【写在前面】vue3在vscode运行正常、build后在IDEA运行正常&#xff0c;但是当部署在服务器上运行发现样式加载不出来&#xff0c;下面我们针对这些情况进行复现与解决。 一、问题分析 困扰我好久&#xff0c;当即百度原因&#xff0c;百度清一色下面三种情况&#xff1a; 1、…

ARM作业,M4

使用CORTEX-M4核&#xff0c;实验中断实验和串口实验结合 gpio.c void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {switch(GPIO_Pin){case GPIO_PIN_7:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);printf("key2 down\n");break;case GPIO_PIN_8:HAL_GPIO_Tog…

[附源码]计算机毕业设计JAVA校园兼职招聘系统

[附源码]计算机毕业设计JAVA校园兼职招聘系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

几款常用database的性能对比

建模三件套&#xff0c;database&#xff0c;algorithm&#xff0c;training data。 这个科普文章&#xff0c;让我们来对比一下市面上常见的DB的性能以及其特殊的工作方式。 市面上常见的有很多&#xff0c;但其中大厂用得比较多的主要还是这几个&#xff1a;mysql、oracle、…

2022圣诞将至,跨境卖家如何做好圣诞节营销?

不知不觉&#xff0c;2022年已正式步入12月了。伴随着“黑五”、“网一”的结束&#xff0c;跨境卖家们又要开始投入下一个大促节日圣诞节的准备中了。作为一年当中最大的购物节日&#xff0c;跨境电商们是无论如何都不能错过这个绝佳的销售机会的。 据Nox聚星了解&#xff0c…

【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析(仿真工程文件+结果图+论文+PPT)

【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析&#xff08;仿真工程文件结果图答辩论文答辩PPT&#xff09; 文章目录【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析&#xff08;仿真工程文件结果图答辩论文答辩PPT&#xff09;任务书设计说…