MutationObserver
可以观察 DOM 元素,并在检测到更改时触发回调。特别适用于监控元素的属性、子节点或者文本内容的变化。这个 API 提供了一个高效的机制来追踪这些变化,避免了频繁的轮询操作,可以提升代码性能。
基本语法
1. 创建 MutationObserver
实例
首先,需要创建一个 MutationObserver
实例,并传入一个回调函数,该回调函数将在监听的 DOM 变化时被调用。回调函数接受两个参数:
-
mutationsList
:一个包含所有发生变化的MutationRecord
对象的列表。MutationRecord 对象具有以下属性:
-
type
—— 变动类型,以下类型之一:"attributes"
:特性被修改了,"characterData"
:数据被修改了,用于文本节点,"childList"
:添加/删除了子元素。
-
target
—— 更改发生在何处:"attributes"
所在的元素,或"characterData"
所在的文本节点,或"childList"
变动所在的元素, -
addedNodes/removedNodes
—— 添加/删除的节点, -
previousSibling/nextSibling
—— 添加/删除的节点的上一个/下一个兄弟节点, -
attributeName/attributeNamespace
—— 被更改的特性的名称/命名空间(用于 XML), -
oldValue
—— 之前的值,仅适用于特性或文本更改,如果设置了相应选项attributeOldValue
/characterDataOldValue
。
-
-
observer
:指向MutationObserver
实例本身的引用。
1 | const observer = new MutationObserver((mutationsList, observer) => { |
2. 配置observe
选项
在开始观察 DOM 变化之前,需要通过 observe
方法指定要观察的目标节点和相应的配置选项。
config
是一个具有布尔选项的对象,该布尔选项表示“将对哪些更改做出反应”,配置选项包括::
childList
——node
的直接子节点的更改,subtree
——node
的所有后代的更改,attributes
——node
的特性(attribute),attributeFilter
—— 特性名称数组,只观察选定的特性。characterData
—— 是否观察node.data
(文本内容),attributeOldValue
—— 如果为true
,则将特性的旧值和新值都传递给回调(参见下文),否则只传新值(需要attributes
选项),characterDataOldValue
—— 如果为true
,则将node.data
的旧值和新值都传递给回调(参见下文),否则只传新值(需要characterData
选项)。
1 | const config = { |
3. 开始观察
1 | observer.observe(targetNode, config); |
4. 停止观察
1 | observer.disconnect(); |
5. 获取已观察的记录
返回自上次调用以来的所有 MutationRecord
对象。
1 | const mutations = observer.takeRecords(); |
常见用例
- 动态内容的更新监控:比如监听笔记软件添加内容等操作,运行特定代码。
- 内容的监听:表单元素的变化监控。
- 属性变化的监听:如按钮状态、样式的变化。
示例代码
监听「思源笔记代码块更改代码语言高亮」的操作,对代码语言进行排序
1 | // 函数:监控dom变化 |