Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知
下方是用来计算某个节点样式改变所用时间
const observerFn = (className, typeName, startTime) => {
const element = document.querySelector(className)
console.log(element)
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.attributeName === typeName) {
observer.disconnect();
const endTime = performance.now();
const duration = endTime - startTime;
console.log(`样式改变耗时 ${duration.toFixed(2)} 毫秒`);
}
});
});
observer.observe(element, { attributes: true });
}
const startTime = performance.now();
observerFn(".vxe-loading", "class", startTime);
MutationObserver 的实例方法
- observe:设置观察目标,接受两个参数,target:观察目标,options:通过对象成员来设置观察选项
- disconnect:阻止观察者观察任何改变
- takeRecords:清空记录队列并返回里面的内容
observe 方法中 options 参数有已下几个选项:
- childList:设置 true,表示观察目标子节点的变化,比如添加或者删除目标子节点,不包括修改子节点以及子节点后代的变化
- attributes:设置 true,表示观察目标属性的改变
- characterData:设置 true,表示观察目标数据的改变
- subtree:设置为 true,目标以及目标的后代改变都会观察
- attributeOldValue:如果属性为 true 或者省略,则相当于设置为 true,表示需要记录改变前的目标属性值,设置了 attributeOldValue 可以省略 attributes 设置
- characterDataOldValue:如果 characterData 为 true 或省略,则相当于设置为 true,表示需要记录改变之前的目标数据,设置了 characterDataOldValue 可以省略 characterData 设置
- attributeFilter:如果不是所有的属性改变都需要被观察,并且 attributes 设置为 true 或者被忽略,那么设置一个需要观察的属性本地名称(不需要命名空间)的列表