MutationObserver
MutationObserver接口提供了监视对DOM树所做更改的能力。
// 选择需要观察变动的节点 const targetNode = document.getElementById('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 (mutation.type === 'childList') { console.log('A child node has been added or removed.'); } else if (mutation.type === 'attributes') { console.log('The ' + mutation.attributeName + ' attribute was modified.'); } } }; // 创建一个观察器实例并传入回调函数 const observer = new MutationObserver(callback); // 以上述配置开始观察目标节点 observer.observe(targetNode, config); // 之后,可停止观察 observer.disconnect();
mutationList的属性如下:
type: 如果是属性发生变化,则返回attributes.如果是一个CharacterData节点发生变化,则返回characterData,如果是目标节点的某个子节点发生了变化,则返回childList. target: 返回此次变化影响到的节点,具体返回那种节点类型是根据type值的不同而不同的,如果type为attributes,则返回发生变化的属性节点所在的元素节点,如果type值为characterData,则返回发生变化的这个characterData节点.如果type为childList,则返回发生变化的子节点的父节点. addedNodes: 返回被添加的节点 removedNodes: 返回被删除的节点 previousSibling: 返回被添加或被删除的节点的前一个兄弟节点 nextSibling: 返回被添加或被删除的节点的后一个兄弟节点 attributeName: 返回变更属性的本地名称 oldValue: 根据type值的不同,返回的值也会不同.如果type为attributes,则返回该属性变化之前的属性值.如果type为characterData,则返回该节点变化之前的文本数据.如果type为childList,则返回null
config全部配置如下:
childList: 设为true以监视目标节点(如果subtree为true,则包含子孙节点)添加或删除新的子节点。默认值为false。 subtree: 设为true以扩展监视范围到目标节点下的整个子树的所有节点 attributes: 设为true以观察受监视元素的属性值变更。默认值为false。 attributeOldValue: 在attributes属性已经设为true的前提下,当监视节点的属性改动时,将此属性设为true 将记录任何有改动的属性的上一个值。 attributeFilter: 要监视的特定属性名称的数组。如果未包含此属性,则对所有属性的更改都会触发变动通知。无默认值。 characterData: 设为true以监视指定目标节点或子节点树中节点所包含的字符数据的变化。无默认值。(一种抽象接口,具体可以为文本节点,注释节点,以及处理指令节点)时,也要观察该节点的文本内容是否发生变化 characterDataOldValue: 在characterData属性已经设为true的前提下,设为true以在文本在受监视节点上发生更改时记录节点文本的先前值