MutationObserver
监听DOM变化(属性变动、目标子节点变化、观察后代节点等)
构造函数
MutationObserver()
创建并返回一个新的
MutationObserver
实例对象,会在指定DOM改变时调用
MutationObserver
对 DOM 的观察不会立即启动;而必须先调用observe()
方法来确定,要监听哪一部分的 DOM 以及要响应哪些更改
const mutationObserver = new MutationObserver()
实例方法
disconnect()
阻止
MutationObserver
实例继续接收通知,除再次调用observe()
方法外,该对象包含的回调函数都将不会再次被调用Tips:如果被观察的元素被从 DOM 中移除,然后被浏览器的垃圾回收机制释放,此
MutationObserver
将同样被删除返回值: undefined
mutationObserver.disconnect()
observe()
配置
MutationObserver
在 DOM 更改匹配给定选项时,通过其回调函数开始接收通知返回值: undefined
mutationObserver.observe(target[, options])
target
- DOM树中的一个要观察变化的DOM Node(可能是一个 Element),或者是被观察的子节点树的根节点
options
-
此对象的配置项描述了 DOM 的哪些变化应该报告给 MutationObserver 的 callback。当调用 observe() 时,childList、attributes 和 characterData 中,必须有一个参数为 true。否则会抛出 TypeError 异常
options
属性如下-
subtree
可选当为
true
时,将会监听以target
为根节点的整个子树。包括子树中所有节点的属性,而不仅仅是针对target
。默认值为false
-
childList
可选当为
true
时,监听target
节点中发生的节点的新增与删除(同时,如果subtree
为true
,会针对整个子树生效)。默认值为false
-
attributes
可选当为
true
时观察所有监听的节点属性值的变化。默认值为true
,当声明了attributeFilter
或attributeOldValue
,默认值则为false
-
attributeFilter
可选用于声明哪些属性名会被监听的数组。如果不声明该属性,所有属性的变化都将触发通知
-
attributeOldValue
可选当为
true
时,记录上一次被监听的节点的属性变化;可查阅监听属性值了解关于观察属性变化和属性值记录的详情。默认值为false
-
characterData
可选当为
true
时,监听声明的target
节点上所有字符的变化。默认值为true
,如果声明了characterDataOldValue
,默认值则为false
-
characterDataOldValue
可选当为
true
时,记录前一个被监听的节点中发生的文本变化。默认值为false
-
tackRecords()
从 MutationObserver 的通知队列中删除所有待处理的通知,并将它们返回到
MutationRecord
对象的新Array
中(返回已检测到但尚未由观察者的回调函数处理的所有匹配 DOM 更改的列表,使变更队列保持为空)此方法最常见的使用场景是在断开观察者之前立即获取所有未处理的更改记录,以便在停止观察者时可以处理任何未处理的更改
Tips:调用
takeRecords()
后,已发生但未传递给回调的变更队列将保留为空返回值:返回一个
MutationRecord
对象列表,每个对象都描述了应用于 DOM 树某部分的一次改动
mutationRecords = mutationObserver.takeRecords()
示例
const moDom = document.querySelector('#moDom')
const mutationObserver = new MutationObserver((mutations) => {
// 属性变动相关处理逻辑
})
mutationObserver.observe(moDom, {
subtree: true, // 将观察器应用于该节点的所有后代节点
attributes: true, // 属性的变动
childList: true, // 子节点的变动(新增、删除或者更改)
characterData: true, // 节点内容或节点文本的变动
})
mutationObserver.disconnect() // 关闭监听实例
浏览器兼容
Mutation Observer
MutationObserver API
MutationObserver API: observe
MutationObserver API: disconnect
MutationObserver API: takeRecords
MutationObserver API: MutationObserver()