李恒道 发表于 2021-9-20 23:58:27

[油猴脚本开发指南]MutationObserver简单详解

# MutationObserver

之前我们已经大概了解MutationObserver函数,这节课我们来详细研究一下传入的参数以及使用。

# MutationBoserver构造函数

```js

MutationObserver()
    创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。
```

```
var observer = new MutationObserver(callback);
observer.observe(targetNode, observerOptions);
```

在构造MutationObserver对象的时候传入一个回调函数,会创建一个对象并返回

对这个对象调用observer函数并传入监控node以及配置选项即可。

observe部分我们暂且不提,我们先来看一下回调函数,查看mdn文档可知

## 语法

```
var observer = new MutationObserver(callback);
```

## 参数

`callback`
一个回调函数,每当被指定的节点或子树以及配置项有Dom变动时会被调用。回调函数拥有两个参数:一个是描述所有被触发改动的 [`MutationRecord`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationRecord) 对象数组,另一个是调用该函数的`MutationObserver` 对象。

我们可以知道,传入的callback回调函数接受两个参数,一个是MutationRecord对象的数组,另一个则是调用该函数的MutationObserver对象,也就是我们new出来的这个对象。

那MutationRecord对象是什么呢?

`MutationRecord` 代表一个独立的 DOM 变化,在每次随 DOM 变化调用 [`MutationObserver`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver) 的回调函数时,一个相应的 `MutationRecord` 会被作为参数,传递给回调函数。

MutationRecord的属性有以下几种

![图片.png](data/attachment/forum/202109/20/234541sf5aaalmlahjwlmb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

这里我们挑几个比较重要的讲

MutationRecord.type

如果返回`attributes`则是属性变化

如果返回`characterData`则是字符数据变化

(注意,根据其他人测试称,仅对CharacterData节点类型数据改变才会被捕获)

如果返回`childList`则是节点树发生变化

MutationRecord.target

返回变化所影响的节点

addedNodes

返回添加的节点列表

removedNodes

返回删除的节点列表

previousSibling

返回被添加或移除的节点之前的兄弟节点,或者 `null`。

nextSibling

返回被添加或移除的节点之后的兄弟节点,或者 `null`。

attributeName

返回被修改的属性的属性名,或者 `null`。

attributeNamespace(这个目前不太清楚,查了一下疑似是XML的东西)

返回被修改属性的命名空间,或者 `null`。

oldValue

返回值取决于 MutationRecord.type

对于属性 `attributes` 变化,返回变化之前的属性值。

对于 `characterData` 变化,返回变化之前的数据。

对于子节点树 `childList` 变化,返回 `null`。

注意,如果要让这个属性起作用,在相应的 MutationObserverInit参数的 `MutationObserver` 的observe方法中,`attributeOldValue` 或者 `characterDataOldValue` 必须设置为 `true`。

# 小总结

我们在new MutationObserver的时候传入一个callback函数,函数在被调用的时候会传入两个参数,一个是MutationRecord数组,一个是调用callback函数的MutationObserver对象本身。

# 对象方法

该对象还存在三个方法,分别为observe、disconnect、takeRecords

我们一个一个来学习

# observe

配置`MutationObserver`在DOM更改匹配给定选项时,通过其回调函数开始接收通知。

调用该函数的时候传入两个参数,分别为target以及options(可选)

`target`
DOM树中的一个要观察变化的DOM [`Node`](https://developer.mozilla.org/zh-CN/docs/Web/API/Node) (可能是一个[`Element`](https://developer.mozilla.org/zh-CN/docs/Web/API/Element)) , 或者是被观察的子节点树的根节点。

`options` **可选**
一个可选的[`MutationObserverInit`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserverInit) 对象,此对象的配置项描述了DOM的哪些变化应该提供给当前观察者的`callback`。

那MutationObserverInit是什么呢?

`MutationObserverInit`字典描述了 `MutationObserver`的配置。

有以下属性

[`childList`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserverInit/childList "childList") **可选**
设为 `true` 以监视目标节点(如果 `subtree` 为 `true`,则包含子孙节点)添加或删除新的子节点。默认值为 `false`。

`subtree` **可选**
设为 `true` 以将监视范围扩展至目标节点整个节点树中的所有节点。`MutationObserverInit` 的其他值也会作用于此子树下的所有节点,而不仅仅只作用于目标节点。默认值为 `false`。

`attributes` **可选**
设为 `true` 以观察受监视元素的属性值变更。默认值为 `false`。

以上三个是比较常用的属性,childlist监控子节点,subtree将监视范围拓展到所有子节点,attribute监控属性值的变更。

`characterData`**可选**
设为 `true` 以监视指定目标节点或子节点树中节点所包含的字符数据的变化。无默认值。

`characterDataOldValue`**可选**
设为 `true` 以在文本在受监视节点上发生更改时记录节点文本的先前值。

[`attributeFilter`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserverInit/attributeFilter "attributeFilter") **可选**
要监视的特定属性名称的数组。如果未包含此属性,则对所有属性的更改都会触发变动通知。无默认值。

`attributeOldValue`**可选**
当监视节点的属性改动时,将此属性设为 `true` 将记录任何有改动的属性的上一个值。

disconnect()

阻止MutationObserver实例继续接收的通知,直到再次调用其[`observe()`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver/observe "observe()")方法,该观察者对象包含的回调函数都不会再被调用。

takeRecords()

从MutationObserver的通知队列中删除所有待处理的通知,并将它们返回到[`MutationRecord`](https://developer.mozilla.org/zh-CN/docs/Web/API/MutationRecord)对象的新[`Array`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)中。

那么到这里我们就已经初步了解了MutationObserver的所有函数以及使用。

最后附上Mutation Event以及MutationObserver的对应关系

来源https://segmentfault.com/a/1190000012787829

![图片.png](data/attachment/forum/202109/21/143454fsmcujzi39ioijuu.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

# 结语

撒花~

amsbman 发表于 2023-4-7 01:46:32

请问这个东西支持jquery吗

李恒道 发表于 2023-4-7 09:52:45

amsbman 发表于 2023-4-7 01:46
请问这个东西支持jquery吗

不支持,两个东西的
页: [1]
查看完整版本: [油猴脚本开发指南]MutationObserver简单详解