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.修 ...
随机推荐
- C++知识点总结篇
const在不同位置时的不同意义 指针类型前:声明一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可以指向其他数据: "*"号和指针名之间, ...
- Python入门学习——PyQt5程序基本结构
在学习python GUI部分时,一开始看书有点懵,看不懂框架,以下是个人学习所得(参考了别人的视频讲解),错误之处,望大家指教 #0.导入需要的包和模块from PyQt5.Qt import * ...
- PAT(B) 1039 到底买不买(Java)字符串
题目链接:1039 到底买不买 (20 point(s)) 题目描述 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串 ...
- PAT甲级题分类汇编——线性
本文为PAT甲级分类汇编系列文章. 线性类,指线性时间复杂度可以完成的题.在1051到1100中,有7道: 题号 标题 分数 大意 时间 1054 The Dominant Color 20 寻找出现 ...
- matplotlib实例笔记
下面的图型是在一幅画布上建立的四个球员相关数据的极坐标图 关于这个图的代码如下: #_*_coding:utf-8_*_ import numpy as np import matplotlib.py ...
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...
- Arm-Linux 移植 ssh
背景: 自己拥有一块开发板,但是苦于上面没有ssh,比较不方便.正好趁这个机会,移植ssh.我们使用的ssh是openssh. host平台 :Ubuntu 18.04 arm平台 : S5P6818 ...
- Linux权限管理:ACL 权限
1.ACL 是什么 ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表.它在UGO权限管理的基础上为文件系统提供一个额外的.更灵活的权限管理机 ...
- Git config 使用说明(转)
原文:https://blog.csdn.net/gdutxiaoxu/article/details/79253737
- Java UpperBound
Java UpperBound /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...