colinox/FED-Notes

监听页面属性或者结构发生变化触发

Opened this issue · 0 comments

监听页面属性或者结构发生变化触发

<div id="a"></div>
<button id="b">改变</button>
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; //浏览器兼容
var config = {
    attributes: true,
    childList: true
}
var $a = document.querySelector('#a');
var $b = document.querySelector('#b');

var observer = new MutationObserver(function (mutations) { //构造函数回调
    mutations.forEach(function (record) {
        if (record.type == "attributes") { //监听属性
            //do any code
            console.log('属性发生改变')
        }
        if (record.type == 'childList') { //监听结构发生变化
            //do any code
            console.log('结构发生改变')
        }
    });
});

observer.observe($a, config);

$b.onclick = function () {
    $a.className = 'game';
    $a.innerHTML = '<div></div>';
}

MutationObserver所观察的DOM变动(即上面代码的option对象),包含以下类型:

  • childList:子元素的变动
  • attributes:属性的变动
  • characterData:节点内容或节点文本的变动
  • subtree:所有下属节点(包括子节点和子节点的子节点)的变动

想要观察哪一种变动类型,就在option对象中指定它的值为true。需要注意的是,不能单独观察subtree变动,必须同时指定childList、attributes和characterData中的一种或多种。

除了变动类型,option对象还可以设定以下属性:

  • attributeOldValue:值为true或者为false。如果为true,则表示需要记录变动前的属性值。
  • characterDataOldValue:值为true或者为false。如果为true,则表示需要记录变动前的数据值。
  • attributesFilter:值为一个数组,表示需要观察的特定属性(比如['class', 'str'])。

disconnect方法和takeRecord方法

disconnect方法用来停止观察。发生相应变动时,不再调用回调函数。

observer.disconnect();

takeRecord方法用来清除变动记录,即不再处理未处理的变动。

observer.takeRecord

MutationRecord对象

DOM对象每次发生变化,就会生成一条变动记录。这个变动记录对应一个MutationRecord对象,该对象包含了与变动相关的所有信息。Mutation Observer进行处理的一个个变动对象所组成的数组。

MutationRecord对象包含了DOM的相关信息,有如下属性:

  • type:观察的变动类型(attribute、characterData或者childList)。
  • target:发生变动的DOM对象。
  • addedNodes:新增的DOM对象。
  • removeNodes:删除的DOM对象。
  • previousSibling:前一个同级的DOM对象,如果没有则返回null。
  • nextSibling:下一个同级的DOM对象,如果没有就返回null。
  • attributeName:发生变动的属性。如果设置了attributeFilter,则只返回预先指定的属性。
  • oldValue:变动前的值。这个属性只对attribute和characterData变动有效,如果发生childList变动,则返回null。