MutationObserverAPI--微任务
1. 作用
MutationObserverAPI可以看作一个监听DOM所有变化(包含节点、属性、文本内容的变动)的接口。
和EventTargetAPI的addEventListener相比:
共同点: 两者的回调函数执行都是异步任务,都要在主执行栈之后执行;
不同点:
1. addEventListener的回调函数会进入宏任务队列;
MutationObserver的回调函数会进入微任务队列
2.addEventListener的触发方式是同步触发;比如,点击后,回调函数立即进入宏任务队列。
MutationObserver的监听是异步触发,在所有的DOM操作完成后才触发使回调函数进入微任务队列。
比如,程序中有10个修改DOM的操作,只有在第十个处理完之后,回调函数才进入微任务队列。
const observer = new MutationObserver(function (mutations, observer) {
console.log(mutations);//[{type: 'childList',.....}]
})
observer.observe(root, {
childList: true,
subtree: true
})
const p = Promise.resolve();
root.appendChild(document.createElement('div'));
// DOM操作执行完成,触发观察回调
p.then(() => {
console.log('d')
})
// 运行结果
d
[{type: .......}]
2. 使用
MutationObserver,顾名思义,是变化观察器。它是一个构造函数,使用时需要创建实例对象,生成一个观察器。
// callback是监听回调函数,当主执行栈结束后触发
// 第一个参数是所有变化产生的变化对象的一个数组,第二个参数是观察器本身
const observer = new MutationObserver(function(mutations, observer) {
});
DOM变化会产生一条变化记录,它是一个MutationRecord对象的实例。
上面的mutations是MutationRecord实例对象的一个集合。
它包含以下属性:
target: 当前变化的节点
type: 变化类型;包含charactorData,childList, attributes三种
addNodes: 新增的节点; 默认[]
removeNodes: 删除的节点;默认[]
previousSibling: 前一个同级节点; 默认null
nextSiblings: 后一个同级节点;默认null
attributeName: 发生变化的属性
oldValue: 变化前的值
MutationObserver.prototype.observe是一个实例方法,用来启动监听器,并指定监听对象,设置监听参数。
所以该方法的调用一定要在所有的DOM操作的最上方,否则监听不到变化。
observer.observer(element, options);
element:
监听的DOM对象
options:
指定观察的具体内容:(3个至少指定一个,否则报错)对应的值都是布尔值。
1. childList (子节点)
还有对应该配置的补充配置:subtree,指定是否是所有的后代节点
2. attributes (属性)
还有对应该配置的补充配置:
attributeOldValue:指定是否记录观察前的属性值
attributeFilter: 一个数组,指定观察的属性值
3. charactorData(节点内容)
还有对应该配置的补充配置:
charactorDataOldValue: 指定是否记录变化前的节点内容
示例:
<div id="root"></div>
<script type="module">
const observer = new MutationObserver(function (mutations, observer) {
console.log(mutations);//[{type: 'childList',.....}]
})
observer.observe(root, {
childList: true,
subtree: true
})
root.appendChild(document.createElement('div'))
</script>
3. 实例方法
1.disconnect()
该方法调用后,关闭监听
2.takeRecords()
删除未处理的变化
4. 应用
1. 观察节点和属性的变化
2.取代DOMContentLoaded事件
MutationObserverAPI--微任务的更多相关文章
- 高大上的微服务可以很简单,使用node写微服务
安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...
- 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- 我所理解的SOA和微服务
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- CI Weekly #5 | 微服务架构下的持续部署与交付
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- 微服务和SOA服务
微服务和SOA都被认为是基于服务的架构,这意味着这两种架构模式都非常强调将“服务”作为其架构中的首要组件,用于实现各种功能(包括业务层面和非业务层面).微服务和SOA是两种差异很大的架构模式,但是他们 ...
- 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端
在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...
- 微服务(Microservices)—Martin Fowler【翻译】
本文转载自:http://www.cnblogs.com/liuning8023/p/4493156.html -------------------------------------------- ...
- 易企秀微场景2016最新完整版V10.5,小编亲测修复众多错误
易企秀V10.5更新说明1.修复拨号英文错误2.修复转送场景问题3.修复设置场景密码乱码问题4.修复前台批量删除客户图片5.修复数据收集分页问题6.修复图片分类错乱问题7.修复音乐和特效冲突问题8.修 ...
随机推荐
- 解决idea中maven项目无法读取src/main/java目录下面的配置文件问题
解决idea中maven项目无法读取src/main/java目录下面的配置文件问题 当我们在maven项目中使用Mybatis的时候,需要给Mybatis配置核心xml文件(MyBatis-Conf ...
- python学习-59 hashlib模块
hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块 加密功能 import hashlib obj = hashlib.md5() # 如果在md5里加上自己设置的参数,别的 ...
- Python学习路线图【转载】
文章来源:https://blog.csdn.net/u014044812/article/details/88079011
- 机器学习-LDA主题模型笔记
LDA常见的应用方向: 信息提取和搜索(语义分析):文档分类/聚类.文章摘要.社区挖掘:基于内容的图像聚类.目标识别(以及其他计算机视觉应用):生物信息数据的应用; 对于朴素贝叶斯模型来说,可以胜任许 ...
- zabbix添加自定义监控(自动发现)遇到的问题
问题:zabbix添加自动发现端口,提示Value should be a JSON object [root@localhost zabbix_agentd.d]# zabbix_get -s 19 ...
- 网页修改<title ></title >标签内容
document.title = 'xxxxxx';
- 使用其他身份运行计算机(DOS命令)
runas/user:administrator cmd d: cd esop sfispri.ini
- GRIT VIEW删除事件
1.点选表格后找到事件 RowCommand 2.輸入gvGroupUser_RowCommand后双击 ------注分 ...
- solr的post.jar
http://iamyida.iteye.com/blog/2207920 跟益达学Solr5之玩转post.jar
- input 被checked时和label配合的妙用
input 和label配合的妙用 1:作为文字隐藏与否的开关: 如下代码:对div里面所包含的文字较多,一开始只展示小部分,当用户点击按钮时,进行全部内容的展示(按钮是以向下隐藏箭头的图片) htm ...