js监听页⾯元素是否变化
// 选择需要观察变动的节点
const targetNode = ElementById('some-id');
// 观察器的配置(需要观察什么变动)
const config = { attributes: true, childList: true, subtree: true };
// 当观察到变动时执⾏的回调函数
const callback = function(mutationsList, observer) {
// Use traditional 'for loops' for IE 11
for(let mutation of mutationsList) {
if (pe === 'childList') {
console.log('A child node has been added or removed.');
}
else if (pe === 'attributes') {
console.log('The ' + mutation.attributeName + ' attribute was modified.');
}
}
};
// 创建⼀个观察器实例并传⼊回调函数
const observer = new MutationObserver(callback);
// 以上述配置开始观察⽬标节点
observer.observe(targetNode, config);
// 之后,可停⽌观察
observer.disconnect();
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⽅法⽤来停⽌观察。发⽣相应变动时,不再调⽤回调函数。
mo.disconnect();
takeRecord⽅法⽤来清除变动记录,即不再处理未处理的变动。
mo.takeRecord();
MutationRecord对象
DOM对象每次发⽣变化,就会⽣成⼀条变动记录。这个变动记录对应⼀个MutationRecord对象,该对象包含了与变动相关的所有信息。Mutation Observer进⾏处理的⼀个个变动对象所组成的数组。
MutationRecord对象包含了DOM的相关信息,有如下属性:
type:观察的变动类型(attribute、characterData或者childList)。
target:发⽣变动的DOM对象。
addedNodes:新增的DOM对象。
removeNodes:删除的DOM对象。
js获取子元素previousSibling:前⼀个同级的DOM对象,如果没有则返回null。
nextSibling:下⼀个同级的DOM对象,如果没有就返回null。
attributeName:发⽣变动的属性。如果设置了attributeFilter,则只返回预先指定的属性。
oldValue:变动前的值。这个属性只对attribute和characterData变动有效,如果发⽣childList变动,则返回null。
实例1 - ⼦元素的变动
var callback = function(records) {
records.map(function(record) {
console.log('mutation type:', pe);
console.log('mutation target:', record.target);
});
};
var mo  = new MutationObserver(callback);
var options = {
childList: true,
subtree: true
};
// 观察body元素的所有下级元素(childList表⽰观察⼦元素,subtree表⽰观察⼦元素的下级元素)的变动。回调函数会在控制台显⽰所有变动的类型和⽬标元素。mo.observe(document.body, options);
实例2 - 属性变动
var callback = function(records) {
records.map(function(record) {
console.log('previous attribute:', record.oldValue);
});
};
var mo =  new MutationObserver(callback);
var element = document.querySelector('#app');
var options = {
attribute: true,
attributeOldValue: true
};
mo.observe(element, options);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。