0%

JS--MutationObserver

MutationObserver

  1. Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。

  2. Vue 内部 nextTick 就使用到了这个 API

  3. ```JS const observer = new MutationObserver(function (mutations, observer) { mutations.forEach(function(mutation) { console.log(mutation); }); });

    const article = document.querySelector('article');

    const options = { childList: true, attributes: true } ;

    observer.observe(article, options);

    // observe()方法接受两个参数,第一个是所要观察的DOM元素是article,第二个是所要观察的变动类型(子节点变动和属性变动)。 /* subtree:布尔值,表示是否将该观察器应用于该节点的所有后代节点。 attributeOldValue:布尔值,表示观察attributes变动时,是否需要记录变动前的属性值。 characterDataOldValue:布尔值,表示观察characterData变动时,是否需要记录变动前的值。 attributeFilter:数组,表示需要观察的特定属性(比如['class','src'])。 /*

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

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

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

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

    ```JS
    // src/core/util/next-tick.js
    ...
    else if (!isIE && typeof MutationObserver !== 'undefined' && (
    isNative(MutationObserver) ||
    // PhantomJS and iOS 7.x
    MutationObserver.toString() === '[object MutationObserverConstructor]'
    )) {
    // Use MutationObserver where native Promise is not available,
    // e.g. PhantomJS, iOS7, Android 4.4
    // (#6466 MutationObserver is unreliable in IE11)
    let counter = 1
    const observer = new MutationObserver(flushCallbacks)
    const textNode = document.createTextNode(String(counter))
    observer.observe(textNode, {
    characterData: true
    })
    timerFunc = () => {
    counter = (counter + 1) % 2
    textNode.data = String(counter)
    }
    }
    ...