MutationObserver对象
MutationObserver对象
MutationObserver (W3C DOM4)对象提供了监视对DOM树所做更改的能力,其被设计为旧的Mutation Events功能的替代品(该功能是DOM3 Events规范的一部分)。
描述
Mutation Observer用来监视DOM变动,DOM的任何变动,例如节点的增减、属性的变动、文本内容的变动,在配置之后都可以通过回调函数来获得通知。Mutation Observer类似于事件的监听DOM.addEventListener方法,都可以在触发某些变动的时候来执行回调函数,只不过Mutation Observer是异步触发,DOM的变动并不会马上触发,在等到当前所有DOM操作都结束才触发。
observe
mutationObserver.observe(target[, options])
Mutation Observer的observe()方法配置了Mutation Observer对象的回调方法,以开始接收与给定选项匹配的DOM变化的通知。
target:DOM树中的一个要观察变化的DOM Node,或者是被观察的子节点树的根节点。options: 一个可选的MutationObserverInit对象,此对象的配置项描述了DOM的哪些变化应该提供给当前观察者的callback,在MutationObserverInit对象中childList、attributes、characterData三个属性之中,至少有一个必须为true,否则会抛出TypeError异常。childList:表示子节点的变动,指新增,删除或者更改字节点。attributes:表示当前节点属性的变动。characterData:表示节点内容或节点文本的变动。subtree:表示是否将该观察器应用于该节点的所有后代节点。attributeOldValue:表示观察attributes变动时,是否需要记录变动前的属性值。characterDataOldValue:表示观察characterData变动时,是否需要记录变动前的值。attributeFilter:表示需要观察的特定属性,比如["class","src"]。
disconnect
mutationObserver.disconnect()
Mutation Observer的disconnect()方法告诉观察者停止观察变动,可以通过调用其observe()方法来重用观察者。
takeRecords
const mutationRecords = mutationObserver.takeRecords()
Mutation Observer的takeRecords()方法返回已检测到但尚未由观察者的回调函数处理的所有匹配DOM更改的列表,使变更队列保持为空。此方法最常见的使用场景是在断开观察者之前立即获取所有未处理的更改记录,以便在停止观察者时可以处理任何未处理的更改。
示例
Mutation Observer的一个常用功能就是观察DOM元素的大小变更,通常是主动resize造成了该元素的大小发生变化,所以需要观察者来完成DOM元素大小变更的副作用。在这里完成了一个简单的示例,观察了attributes与childList两个属性值,并在attributes中使用attributeFilter来过滤只观察style属性的变动,因为在这里是使用的contenteditable来完成的DOM元素的编辑,所以是使用了childList来完成了子元素的变更观察。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mutation Observer</title>
<style>
#observer-dom{
padding: 5px;
resize: both;
width: 300px;
height: 200px;
border: 1px solid #eee;
resize: both;
overflow: auto;
}
#observer-dom:empty:before {
content: attr(data-placeholder);
color: #aaa;
}
#observer-output{
width: 300px;
height: 200px;
border: 1px solid #eee;
margin-top: 20px;
}
</style>
</head>
<body>
<div id="observer-dom" contenteditable data-placeholder="Enter OR Resize"></div>
<textarea id="observer-output"></textarea>
</body>
<script>
const target = document.getElementById("observer-dom");
const textarea = document.getElementById("observer-output");
textarea.value = "output: \n";
const addOutput = log => {
textarea.value = textarea.value + log + "\n";
textarea.scrollTop = textarea.scrollHeight;
}
const config = { attributes: true, childList: true, attributeFilter: ["style"] };
const callback = function(mutationsList, observer) {
for(const mutation of mutationsList) {
console.log(mutation);
if(mutation.type === "childList"){
addOutput("ChildListAdded: " + mutation.addedNodes.length)
}else if(mutation.type === "attributes"){
addOutput("AttributeNameChange: " + mutation.attributeName)
}
}
};
const observer = new MutationObserver(callback);
observer.observe(target, config);
</script>
</html>
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://juejin.cn/post/6949832945683136542
https://developer.mozilla.org/en-US/docs/Web/API/MutationEvent
https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
MutationObserver对象的更多相关文章
- 使用MutationObserver对象封装一个监听DOM生成的函数
(function(win){ 'use strict'; var listeners = []; var doc = win.document; var MutationObserver = win ...
- livequery源码解读
从使用说起: 若干年前,有一天发现,通过js代码创建的html元素及ajax加载的html,无法被$([selector]).click(function(){...})绑定上事件,于是发现了jQue ...
- electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)
窗口间通信的问题 electron窗口通信比nwjs要麻烦的多 electron分主进程和渲染进程,渲染进程又分主窗口的渲染进程和子窗口的渲染进程 主窗口的渲染进程给子窗口的渲染进程发消息 subWi ...
- JavaScript:再谈Tasks和Microtasks
JavaScript是单线程,也就是说JS的堆栈中只允许有一类任务在执行,不可以同时执行多类任务.在读js文件时,所有的同步任务是一条task,当然了,每一条task都是一个队列,按顺序执行.而如果在 ...
- Vue系列---理解Vue.nextTick使用及源码分析(五)
_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...
- 【vue】nextTick源码解析
1.整体入手 阅读代码和画画是一样的,忌讳一开始就从细节下手(比如一行一行读),我们先将细节代码折叠起来,整体观察nextTick源码的几大块. 折叠后代码如下图 整体观察代码结构 上图中,可以看到: ...
- 做一个能对标阿里云的前端APM工具(上)
APM 全称是 Application Performance Monitor,即性能监控 这篇文章有三个前提: 从产品形态上看这肯定不是一个能够媲美阿里产品的竞品,所以抱歉我碰瓷了.你可以把这里的阿 ...
- window监听节点改变的接口
监听页面某个元素的属性变化 window.MutationObserver(callback) Mutation Observer API 用来监视 DOM 变动.比如节点的增减.属性的变动.文本内容 ...
- 强大的DOM变化观察者MutationObserver
在这之前 DOM3 提供了 Mutation events 事件 DOMAttrModified DOMAttributeNameChanged DOMCharacterDataModified DO ...
- JavaScript是如何工作的:使用MutationObserver跟踪DOM的变化
摘要: 掌握MutationObserver. 这是专门探索 JavaScript 及其所构建的组件的系列文章的第10篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工 ...
随机推荐
- 使用pip安装pycharm插件时,要使用管理员权限打开cmd安装
1.问题 安装到一半报错 报错1 报错2 2.解决 解决1 原文:https://blog.csdn.net/weixin_44899752/article/details/128372969 下面是 ...
- [转帖]043、TiDB特性_缓存表和分区表
针对于优化器在索引存在时依然使⽤全表扫描的情况下,使⽤缓存表和分区表是提升查询性能的有效⼿段. 缓存表 缓存表是将表的内容完全缓存到 TiDB Server 的内存中 表的数据量不⼤,⼏乎不更改 读取 ...
- [转帖]JMeter InfluxDB v2.0 listener plugin
https://github.com/mderevyankoaqa/jmeter-influxdb2-listener-plugin Support my Ukrainian Family ️ Lik ...
- [转帖]查询机器序列号--Linux/esxi/windows
https://www.jianshu.com/p/6abaea79e0c3 Ipmitool--Linux&Esxi&Windows # ipmitool fru list|grep ...
- [转帖]SkyWalking集成logback
1.引入skywalking的jar包,导入的包和agent版本一致 <dependency> <groupId>org.apache.skywalking</group ...
- Nginx调优总结-第六部分编译优化与简单测试
第六部分 编译优化 Nginx可以自行编译,所以里面可以设置多个编译策略. 也可以自行修改源码,便于比如进行ip_hash的全IP地址验证. 也可以修改nginx的版本号等信息, 避免内发现. 还可以 ...
- Docker 运行 Redis Rabbitmq seata-server ftp 的简单办法
公司里面用到了很多组件, 发现安装二进制太麻烦了, 所以想用Docker 进行安装. 这里面简单给总结一下就不在折腾了.. 1. redis docker run -d -p 6379:6379 -- ...
- 【贪心】AGC018C Coins
Problem Link 现在有 \(X+Y+Z\) 个人,第 \(i\) 个人有三个权值 \(a_i,b_i,c_i\),现在要求依次选出 \(X\) 个人,\(Y\) 个人和 \(Z\) 个人(一 ...
- 【VMware vSAN】使用命令行从vSAN集群中移除ESXi主机并加入到新的vSAN集群。
说明 本文只是陈述了一种方法,不必评判谁对谁错谁好谁坏,选择适合自己的即可. 环境 站点名称 vCenter版本 vSAN集群 集群主机 主机版本 磁盘组 vcsa67.lab.com vCenter ...
- [置顶] python常用web开发框架
Flask篇 第一篇:初识Flask.快速启动 第二篇:Flask四剑客 第三篇:Flask的配置文件 第四篇:Flask路由 第五篇:Flask模板渲染 第六篇:Flask的请求与响应 第七篇:Fl ...