1 概述

Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API。为什么要使用mutation observer 去代替 mutation events 呢,我们先了解一下mutation events

Mutation Events

Mutation events 是在 DOM3中定义,用于监听DOM树结构变化的事件

它简单的用法如下:

document.getElementById('list').addEventListener("DOMSubtreeModified", function(){ console.log('列表中子元素被修改'); }, false);

Mutation 事件列表

  • DOMAttrModified
  • DOMAttributeNameChanged
  • DOMCharacterDataModified
  • DOMElementNameChanged
  • DOMNodeInserted
  • DOMNodeRemoved
  • DOMNodeInsertedIntoDocument
  • DOMSubtreeModified

其中DOMNodeRemoved,DOMNodeInserted 和 DOMSubtreeModified 分别用于 监听元素子项的删除,新增,修改(包括删除和新增),
DOMAttrModified 是监听元素属性的修改,并且能够提供具体的修改动作。

Mutation Events遇到的问题
  • 浏览器兼容性问题
    IE9不支持Mutation Events
    Webkit内核不支持DOMAttrModified特性,
    DOMElementNameChanged和DOMAttributeNameChanged 在Firefox上不被支持。
  • 性能问题
    1.Mutation Events是同步执行的,它的每次调用,都需要从事件队列中取出事件,执行,然后事件队列中移除,期间需要移动队列元素。如果事件触发的较为频繁的话,每一次都需要执行上面的这些步骤,那么浏览器会被拖慢。
    2.Mutation Events本身是事件,所以捕获是采用的是事件冒泡的形式,如果冒泡捕获期间又触发了其他的MutationEvents的话,很有可能就会导致阻塞Javascript线程,甚至导致浏览器崩溃。

Mutation Observer

Mutation Observer 是在DOM4中定义的,用于替代 mutation events 的新API,它的不同于events的是,所有监听操作以及相应处理都是在其他脚本执行完成之后异步执行的,并且是所以变动触发之后,将变得记录在数组中,统一进行回调的,也就是说,当你使用observer监听多个DOM变化时,并且这若干个DOM发生了变化,那么observer会将变化记录到变化数组中,等待一起都结束了,然后一次性的从变化数组中执行其对应的回调函数。

Mutation Observer 的浏览器兼容范围

兼容性

2 方法

构造函数

用来实例化一个Mutation观察者对象,其中的参数是一个回调函数,它是会在指定的DOM节点发送变化后,执行的函数,并且会被传入两个参数,一个是变化记录数组(MutationRecord),另一个是观察者对象本身

new MutationObserver(function(records, itself){});
observe

在观察者对象上,注册需要观察的DOM节点,以及相应的参数

void observe(Node target, optional MutationObserverInit options)

其中的可选参数 MutationObserverInit的属性如下:

childLIst 观察目标节点的子节点的新增和删除。
attributes 观察目标节点的属性节点(新增或删除了某个属性,以及某个属性的属性值发生了变化)。
characterData 如果目标节点为characterData节点(一种抽象接口,具体可以为文本节点,注释节点,以及处理指令节点)时,也要观察该节点的文本内容是否发生变化
subtree 观察目标节点的所有后代节点(观察目标节点所包含的整棵DOM树上的上述三种节点变化)
attributeOldValue 在attributes属性已经设为true的前提下, 将发生变化的属性节点之前的属性值记录下来(记录到下面MutationRecord对象的oldValue属性中)
characterDataOldValue 在characterData属性已经设为true的前提下,将发生变化characterData节点之前的文本内容记录下来(记录到下面MutationRecord对象的oldValue属性中)
attributeFilter 一个属性名数组(不需要指定命名空间),只有该数组中包含的属性名发生变化时才会被观察到,其他名称的属性发生变化后会被忽略想要设置那些删选参数的话,

如果想要使用哪个参数的话,就将其值设定为true

disconnect

暂定在观察者对象上设置的节点的变化监听,直到重新调用observe方法

takeRecords

在观察者对象上调用takeRecords 会返回 其观察节点上的变化记录(MutationRecord)数组
其中MutationRecord数组也会作为,观察者初始化时的回调函数的第一个参数
其包含的属性如下:

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

3 使用实例

// Firefox和Chrome早期版本中带有前缀
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver // 选择目标节点 var target = document.querySelector('#some-id'); // 创建观察者对象 var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { console.log(mutation.type); }); }); // 配置观察选项: var config = { attributes: true, childList: true, characterData: true } // 传入目标节点和观察选项 observer.observe(target, config); // 随后,你还可以停止观察 observer.disconnect();

4 参考链接

[1].MDN Mutation Observer
[2].将突变事件和属性更改事件迁移到突变观察者

文/falm(简书作者)
原文链接:http://www.jianshu.com/p/b5c9e4c7b1e1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

MutationObserver 监听DOM树变化相关推荐

  1. JS实时监听DOM元素变化 - MutationObserver

    使用 MutationObserver API实时监听DOM元素变化 创建 MutationObserver 实列,接受一个用于监听到DOM元素变化的回调函数 const handleListenCh ...

  2. vue监听dom元素变化修改echar图表

    文章目录 前言 一.install监听依赖 二.使用步骤 1.监听指定id并修改echarts宽高 监听Windows窗口变化 前言 提示:这里可以添加本文要记录的大概内容: vue中监听dom元素变 ...

  3. JavaScript监听DOM节点变化事件

    JS监听页面DOM节点的变化 DOMSubtreeModified DOMNodeInserted DOMNodeRemoved DOMNodeInsertedIntoDocument DOMNode ...

  4. Vue + Element UI——监听DOM元素高度和宽度解决方案整理(八种方法)

    问题描述 监听DOM元素大小的变化,在前端开发中,算是一个比较常见的需求,比如我们要制作可伸缩的图表的时候,可能需要根据DOM大小的变化,进行动态的更新图表. 解决方案 方法一: 监听window变化 ...

  5. js 监听dom属性的变化,如id,class

    tinymce中的颜色选择器,选择后只有下划线变了颜色,UI要求字体也变色.下划线和上面的字母都是svg中的path,没有change之类的事件可以监听. <editor@onInit=&quo ...

  6. 动态监听DOM元素的高度

    1.背景 考虑这样一种情况,产品同学希望达到以下功能: 在我们的网页中有一个固定区域,这个区域会用于渲染从后端拉取的含有图片等资源的富文本字符串. 他需要在内容不超过一个最大高度的时候完全显示所有内容 ...

  7. Javascript中关于监听DOM元素状态的方法使用

    Javascript中关于监听DOM元素状态的方法使用 MutationObserver MutationObserver是针对DOM元素的观察器,观察它体内增加/减少子(爷孙)节点,或者子节点的属性 ...

  8. jquery实时监听输入框值变化

    在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能满足条 ...

  9. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

最新文章

  1. 一文看懂docker容器技术架构及其中的各个模块
  2. 阿里技术人的第一节课
  3. Mac OS build caffe2 Error:This file was generated by an older version of protoc which is
  4. h5-16-SVG 与 HTML5 的 canvas 各自特点
  5. MySQL 数据库利用alter语句修改表字段属性实例演示,如何拓展表字段长度,sql语句修改表字段名称和类型
  6. 什么是nginx负载均衡高可用
  7. 基于深度学习的病理_组织病理学的深度学习(第二部分)
  8. P4301-[CQOI2013]新Nim游戏【线性基】
  9. CVPR 2021 最佳论文!对抗神经网络GAN解决3D场景难题
  10. 关于一致性hash算法的几个问题
  11. 电脑很卡反应很慢该如何处理_我的苹果电脑中毒了,好开心
  12. python color属性_模块“cv2.cv2”没有“COLOR”属性“BGR2GREY”
  13. ubuntu未发现wifi适配器_Windows 10 9月更新频翻车,1903版本网络适配器又出bug
  14. 拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
  15. 【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置
  16. tensorflow中FLAGS全局变量用法
  17. [测试开发面试]zyb面试题总结
  18. 每日一问 --发信机和收信机对信号做了那些处理?
  19. 江苏五大姓氏世家,第一王,第二张,看看你是不是来自名门望族
  20. 【YOLOv5 Head解耦】

热门文章

  1. 如何在服务器端写关闭窗口的代码?同时能够更新父窗口?
  2. CCF-CSP 201703-2 试题名称: 学生排队(满分代码)
  3. CSDN如何快速转载别人的博客(附简单详细方法)
  4. 机器人产业:借人工智能突破“拐点”
  5. 深度学习果实即将摘尽?11位大牛谈AI的当下(2018)与未来(2019)
  6. IAR实际使用过程中遇到的问题
  7. Zabbix3.X---Zabbix _Agent主动模式的监控(Active)
  8. 使用栈结构完毕四则运算
  9. C# Process执行bat
  10. 5.4 异步TCP编程(一)