MutationObserver 是一个内建对象,它观察 DOM 元素,并在检测到更改时触发回调。
我们将首先看一下语法,然后探究一个实际的用例,以了解它在什么地方有用。
语法
MutationObserver 使用简单。
首先,我们创建一个带有回调函数的观察器:
let observer = new MutationObserver(callback);
然后将其附加到一个 DOM 节点:
observer.observe(node, config);
config 是一个具有布尔选项的对象,该布尔选项表示“将对哪些更改做出反应”:
childList——node的直接子节点的更改,subtree——node的所有后代的更改,attributes——node的特性(attribute),attributeFilter—— 特性名称数组,只观察选定的特性。characterData—— 是否观察node.data(文本内容),
其他几个选项:
attributeOldValue—— 如果为true,则将特性的旧值和新值都传递给回调(参见下文),否则只传新值(需要attributes选项),characterDataOldValue—— 如果为true,则将node.data的旧值和新值都传递给回调(参见下文),否则只传新值(需要characterData选项)。
然后,在发生任何更改后,将执行“回调”:更改被作为一个 MutationRecord 对象列表传入第一个参数,而观察器自身作为第二个参数。
MutationRecord 对象具有以下属性:
type—— 变动类型,以下类型之一:"attributes":特性被修改了,"characterData":数据被修改了,用于文本节点,"childList":添加/删除了子元素。
target—— 更改发生在何处:"attributes"所在的元素,或"characterData"所在的文本节点,或"childList"变动所在的元素,addedNodes/removedNodes—— 添加/删除的节点,previousSibling/nextSibling—— 添加/删除的节点的上一个/下一个兄弟节点,attributeName/attributeNamespace—— 被更改的特性的名称/命名空间(用于 XML),oldValue—— 之前的值,仅适用于特性或文本更改,如果设置了相应选项attributeOldValue/characterDataOldValue。
例如,这里有一个 <div>,它具有