强大的DOM变化观察者MutationObserver

在这之前 DOM3 提供了 Mutation events 事件

  1. DOMAttrModified
  2. DOMAttributeNameChanged
  3. DOMCharacterDataModified
  4. DOMElementNameChanged
  5. DOMNodeInserted
  6. DOMNodeInsertedIntoDocument
  7. DOMNodeRemoved
  8. DOMNodeRemovedFromDocument
  9. DOMSubtreeModified

可以监听到属性、文本内容、节点插入删除、子节点变化等事件。可是该事件 W3C 已废弃,虽然一些浏览器仍然支持,但不建议使用。

MutationObserver目前IE11+及其它浏览器最新版本都已支持。可以通过以下代码判断是否支持

var MutationObserver = window.MutationObserver ||
    window.WebKitMutationObserver ||
    window.MozMutationObserver;

var supportMutationObserver = !!MutationObserver;

使用如下

var mo = new MutationObserver(callback);
var div = document.querySelector(‘div‘);

var options = {
    ‘childList‘: true,
    ‘arrtibutes‘: true
};

mo.observer(div, options);

options 是配置参数,这里的配置可以观察到 div 元素的子元素和属于变动。

options 有如下选项

  1. childList: 子元素的变动
  2. attributes: 属性的变动
  3. characterData: 节点内容或节点文本的变动
  4. subtree: 所有下属节点(包括子节点和子节点的子节点)的变动
  5. attributeOldValueL: 值为true或者为false。如果为true,则表示需要记录变动前的属性值
  6. characterDataOldValue: 值为true或者为false。如果为true,则表示需要记录变动前的数据值
  7. attributesFilter: 值为一个数组,表示需要观察的特定属性(比如[‘class‘, ‘str‘])

当变动发生时回调函数会将变动记录 MutationRecord 对象传入,MutationRecord 包含了 DOM 的相关信息,有如下属性

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

示例1:观察子元素的变动

function callback(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob = new MutationObserver(callback)
ob.observe(app1, {
  childList: true,
  subtree: true
})

p1

app1

配置项 childList 表示观察子元素,subtree 表示观察子元素的下级元素。在本页面的浏览器控制台输入以下代码分别测试

app1.removeChild(p1)

app1.appendChild(document.createTextNode(‘TEST‘))

示例2:观察属性的变化

function callback2(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob2 = new MutationObserver(callback2)
ob2.observe(app2, {
  attribute: true,
  attributeOldValue: true
})

app2

配置参数跟踪属性变动(‘attributes‘: true),然后设定记录变动前的值。实际发生变动时,会将变动前的值显示在控制台。打开本页面的浏览器控制台,输入以下代码测试

app2.id = ‘apptest‘

示例3:观察文本元素的变化

function callback3(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob3 = new MutationObserver(callback3)
ob3.observe(app3, {
  characterData: true
})

示例3:观察元素内容的变动

function callback3(records) {
  records.forEach(function(record) {
    console.log(record)
  })
}
var ob3 = new MutationObserver(callback3)
ob3.observe(app3, {
  childList: true,
  characterData: true,
  characterDataOldValue: true
})

old value

配置项会观察元素文本的变化,当变动时会记录老的文本元素。打开本页面的浏览器控制台,输入以下代码测试

app3.appendChild(document.createTextNode(‘ hello‘))

相关:

https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

https://dev.opera.com/articles/mutation-observers-tutorial/

http://michalbe.blogspot.com/2013/04/javascript-less-known-parts-dom.html

时间: 2024-10-04 13:00:59

强大的DOM变化观察者MutationObserver的相关文章

js动态监听dom变化

原生js 动态监听dom变化,根据不同的类型绑定不同的处理逻辑 // Firefox和Chrome早期版本中带有前缀   var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver      // 选择目标节点   var target = document.querySelector('#some-id');       // 创建观察

html5监控某个dom变化

var targetSecondNode = $(".secondList")[0];//要监控的dom对象 var obSecondServer = new MutationObserver(function (mutations) { //dom变化回调的函数 $(".secondList .item-list div:first").addClass("active"); $(".secondList .item-list div

监听DOM变化

DOM变化分为以下七种: 1. DOMSubtreeModified:在DOM结构中发生任何变化时触发:  2. DOMNodeInserted:在一个节点作为子节点被插入到另一个节点中时触发:  3. DOMNodeRemoved:在节点从其父节点中被移除时触发:  4. DOMNodeInsertedIntoDocument:在一个节点被直接插入文档中或者通过子树间接插入文档后触发.在DOMNodeInserted之后触发:  5. DOMNodeRemovedFromDocument:在一

MutationObserver 监听DOM树变化

1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 mutation events 呢,我们先了解一下mutation events Mutation Events Mutation events 是在 DOM3中定义,用于监听DOM树结构变化的事件 它简单的用法如下: document.getElementById('list').addEvent

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学

HTML5 MutationObserver检测页面劫持

好久没写博客了,业务一直在变化,陆陆续续的做了很多web app,被业务流淹没就很少有机会去反思,前端技术发展如此之快,常常有种不学则退的恐慌,一种技术还没吃透就涌出新的技术,然后一波人又打着各种旗帜去宣传,想偷懒都不行,大脑完全不够用. Nodejs,AngularJS,vuejs,React,grunt,gulp,webpack...Fuck! HTML5的水很深很深,感觉还有很多技术没有挖掘和使用.无意中发现HTML5 DOM4级MutatioObserver方法,可以检查页面中的DOM是

DOM编程

一.DOM操作慢的本质原因 文档对象模型(DOM)是一个与语言无关的,用于操作XML和HTML文档的应用程序接口.DOM在浏览器中的接口是用JavaScript实现的.浏览器通常会把DOM和JavaScript独立实现. (1)在IE中,JavaScript的实现名为JScript,位于jscript.dll文件中:DOM的实现则存在另一个库中,名为mshtml.dll(内部叫Trident),UA头: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0;

摆脱DOM操作,从TodoMVC看angularJS

取代jQuery? 我很久之前便听说了angularJS的大名,之前的leader也经常感叹angularJS的设计如何如何精妙,可叹一直没有机会深入了解,国庆长假因为没钱出游,倒是可以对他做一个了解...... 根据之前的经验,就现有的前端项目,如果最初没有良好的设计,做到一定阶段一定会变得难以维护,就算最初有设计,变化无常的PM也会让你的项目BUG丛生. 一个页面的复杂程度不断的增加,依赖模块也会变得混乱,而其中最为头疼的就是页面级随心所欲的DOM操作了! MVC类的框架可以很好的解决以上问

高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)

写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但真的是打心底里仰慕,希望自己有朝一日能过到他那个高度) 既然现在还达不到那个层次,就好好堆砖吧,当砖堆到一定高度也自然会上一个小台阶. 脚本位置 脚本会阻塞页面渲染,直到它们全部下载并执行完成,页面才会继续渲染.页面只有加载并执行完前面一个script外部文件才会去加载下面一个script标签. 在