48.MutationObserver

111 阅读2分钟

之前说任务队列里有说道"MutationObserver",MutationObserver是一个异步的任务,x MutationObserver用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动都会触发MutationObserver事件。

构造MutationRecord

MutationRecord是一个构造函数,通过new来产生实例,接收一个回调函数,回调函数有两个参数,一个变动数组,第二个是观察者实例。

    // 创建MutationObserver实例,返回一个观察者对象
    const mutation = new MutationObserver(function (mutationsList, observer) {
      console.log(mutationsList)
      console.log(observer)
    })

我们可以在回到的数组mutationsList里面拿到变化的对象

MutationRecord实例的方法

observe

对观察者添加需要观察的元素,并设置需要观察元素的哪些方面

mutation.observe(container, options);

其中options包括

属性类型描述
childListBoolean是否观察子节点的变动
attributesBoolean是否观察属性的变动
characterDataBoolean是否节点内容或节点文本的变动
subtreeBoolean是否观察所有后代节点的变动
attributeOldValueBoolean观察 attributes 变动时,是否记录变动前的属性值
characterDataOldValueBoolean观察 characterData 变动时,是否记录变动前的属性值
attributeFilterArray表示需要观察的特定属性(比如['class','src']),不在此数组中的属性变化时将被忽略

disconnect

disconnect方法用来停止观察。调用该方法后,DOM 再发生变动,也不会触发观察器。

takeRecords

用来清除变动记录,即不再处理未处理的变动。该方法返回变动记录的数组

MutationRecord 对象

DOM 每次发生变化,就会生成一条变动记录(MutationRecord 实例)。该实例包含了与变动相关的所有信息。Mutation Observer 处理的就是一个个MutationRecord实例所组成的数组。
MutationRecord对象包含了DOM的相关信息,有如下属性:

属性类型描述
typeString根据变动类型,值为 attributes, characterData 或 childList
targetNode发生变动的DOM节点
addedNodesNodeList被添加的节点,或者为 null
removedNodesNodeList被删除的节点,或者为 null
previousSiblingNode被添加或被删除的节点的前一个兄弟节点,或者为 null
nextSiblingNode被添加或被删除的节点的后一个兄弟节点,或者为 null
attributeNameString发生变更的属性的本地名称,或者为 null
attributeNamespaceString发生变更的属性的命名空间,或者为 null
oldValueString如果 type 为 attributes,则返回该属性变化之前的属性值;如果 type 为 characterData,则返回该节点变化之前的文本数据;如果 type为 childList,则返回 null

我们可以通过这些属性去执行你的代码