监听页面某个元素的属性变化

window.MutationObserver(callback)

Mutation Observer API 用来监视 DOM 变动。比如节点的增减、属性的变动、文本内容的变动。MutationObserver是一个构造器,接收一个回调函数callback用来处理节点变化时所做的操作.

要概念上,它很接近事件。可以理解为,当DOM发生变动会触发Mutation Observer事件。但是,它与事件有一个本质不同:事件是同步触发,也就是说DOM发生变动立刻会触发相应的事件;Mutation Observer则是异步触发,DOM发生变动以后,并不会马上触发,而是要等到当前所有DOM操作都结束后才触发。

Mutation Observer有以下特点:

  • 它等待所有脚本任务完成后,才会运行,即采用异步方式
  • 它把DOM变动记录封装成一个数组进行处理,而不是一条条地个别处理DOM变动。
  • 它即可以观察发生在DOM节点的所有变动,也可以观察某一类变动

一般写法:

const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver

const observer = new MutationObserver(mutationCallback);

MutationObserver对象有三个方法,分别如下:

  1. observe:设置观察目标,接受两个参数:target:观察目标,config:设置观察选项

      observer.observe(dom, config);// 后面介绍config的配置

    2. disconnect:取消对目标节点的监听。

      observer.disconnect();

    3. takeRecords:取出记录队列中的记录。它的一个作用是当你不想对节点变化立刻做出反应,过段时间再显示改变了节点的内容。

      takeRecords方法用来清除变动记录,即不再处理未处理的变动。该方法返回变动记录的数组。

      var record = observer.takeRecords();

    4. config配置(只介绍常用的几个):

      let config = {
        attributes: true, //目标节点的属性变化
        childList: true, //目标节点的子节点的新增和删除
        characterData: true, //如果目标节点为characterData节点(一种抽象接口,具体可以为文本节点,注释节点,以及处理指令节点)时,也要观察该节点的文本内容是否发生变化,节点内容或节点文本的变动
        subtree: true, //表示是否将该观察器应用于该节点的所有后代节点

        attributeOldValue: true, // 表示观察attributes变动时,是否需要记录变动前的属性值

        characterDataOldValue: true, // 表示观察characterData变动时,是否需要记录变动前的值

        attributeFilter: [] // 表示需要观察的特定属性,如['class','src']
      };
    5. callback 回调

      返回参数mutationsRecord数组, instance

      MutationRecord对象:

      DOM 每次发生变化,就会生成一条变动记录(MutationRecord 实例)。该实例包含了与变动相关的所有信息。Mutation Observer 处理的就是一个个MutationRecord实例所组成的数组。
      
      MutationRecord对象包含了DOM的相关信息,有如下属性:
        type:观察的变动类型(attribute、characterData或者childList)。

        target:发生变动的DOM节点。

        addedNodes:新增的DOM节点。

        removedNodes:删除的DOM节点。

        previousSibling:前一个同级节点,如果没有则返回null。

        nextSibling:下一个同级节点,如果没有则返回null。

        attributeName:发生变动的属性。如果设置了attributeFilter,则只返回预先指定的属性。

        oldValue:变动前的值。这个属性只对attribute和characterData变动有效,如果发生childList变动,则返回null
 
 
示例: 
//获取元素
var box = document.getElementById("box"); //配置选项
var config = { attributes: true, childList: true, subtree: true }; var observer = new MutationObserver(function (mutationsList, observer) {
for (var mutation of mutationsList) {
if (mutation.type == 'childList') {
console.log('子元素被修改');
}
else if (mutation.type == 'attributes') {
console.log(mutation.attributeName + '属性被修改');
}
}
}); //开始观测
observer.observe(box, config); //停止观测
// observer.disconnect(); box.className = "active"
box.innerHTML = "哈哈哈"

window监听节点改变的接口的更多相关文章

  1. 实时监听 JavaScript改变 input 值 input输入框内容 value 变化实时监听

    思路:通过setInterval()方法去定时对比新旧值 当时候JavaScript的onchange 和onpropertychange(注意ie版本) 监听输入框input时间,人为改变值是可以触 ...

  2. 利用Node的chokidar 监听文件改变的文件。

    最近维护一个项目.每次改完东西,都要上传到服务器.然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变.然后我再利用程序把更改的文件一键上传到服务器. 于是就找到了nodejs 的chok ...

  3. ArcEngine GroupLayer监听图层改变

    最近项目中需要用到在TOC监听图层的变化,从而针对添加的不同图层进行不同的操作.但是当TOC中添加图层组时,无法监听到图层组中添加图层的动作.也就无法获取到向图层组中添加的图层. 在开发手册中也没有找 ...

  4. React router内是如何做到监听history改变的

    问题背景 今天面试的时候,被问到这么个问题.在html5的history情况下,pushstate和replacestate是无法触发pushstate的事件的,那么他是怎么做到正确的监听呢?我当时给 ...

  5. js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写

    js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写 一.总结 一句话总结:滚动事件scroll(),浏览器窗口调整监听resize(),思考好监听对象. 1.滚动事件scroll()的监听对象是 ...

  6. vue 中监听窗口发生变化,触发监听事件, window.onresize && window.addEventListener('resize',fn) ,window.onresize无效的处理方式

    // 开始这样写,不执行 window.onresize = function() { console.log('窗口发生变化') } // 改成window监听事件 window.addEventL ...

  7. Zookeeper(2)---节点属性、监听和权限

    之前通过客户端连接之后我们已经知道了zk相关的很多命令(Zookeeper(1)---初识). 节点属性: 现在我们就通过stat指令来看看节点都有哪些属性,或者使用get 指令和-s参数来查看节点数 ...

  8. Zookeeper Curator 事件监听 - 秒懂

    目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...

  9. Android 动态监听网络 断网重连

    需求: 网络连接断开 弹出popupwindow 当前网络连接断开 网络恢复时popupwindow 消失重新请求网络. 需求描述完毕 上一张帅图 思路:广播 发送及时消息 断网flag  popup ...

  10. zookeeper实现项目初始化缓存以及同步监听

    Spring-利用InitializingBean接口和zookeeper实现项目初始化缓存以及同步监听 1.先贴出几个需要用到的工具类 ZkClientUtils import com.ithzk. ...

随机推荐

  1. 【Quartus系列】实验一: 3-8译码器(原理图输⼊设计)

    实验一: 3-8译码器(原理图输⼊设计) ⼀:实验⽬的 1. 了解3-8译码器的电路原理,掌握组合逻辑电路的设计⽅法 2. 掌握QuartusII软件原理图输⼊设计的流程 ⼆:实验内容 2.1设计输⼊ ...

  2. 国际版Office365客户端配置

    Email Provider IMAP Settings POP Settings SMTP Settings Microsoft 365 Outlook Hotmail Live.com Serve ...

  3. servlet和spring框架的关系

    1.Servlet是什么? servlet就是一个Java接口,是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能. 由其他内部厂商如tomcat,JBoss内部实现web的功能. ...

  4. 单个表空间文件个数达到上限 ORA-01686

    # 问题概述因在oracle数据库表空间管理中的时候 报 ORA-01686: max # files (1023) reached for the tablespace GPRS SQL> a ...

  5. 2019-2020-1 20199318《Linux内核原理与分析》第八周作业

    第7章 可执行程序工作原理 一.学习笔记 1.ELF 2.程序编译 3.连接与库 二.试验记录 1.开始先更新内核,再用test_exec.c将test.c覆盖掉 2.test.c文件中增加了exec ...

  6. Wps调用dll操作Excel表格转PDF

    起始原因:wps编辑创建的文档在microsoft office 中打开,会报内容存在异常是否恢复,因此wps文件被微软设定为破损文件,无法对原有文档进行操作运行,故在此使用wps对Excel进行操作 ...

  7. vue点击遮罩层阴影区域隐藏

    <div class="overlay" v-if="mask" @click="closeMaskTap($event)"> ...

  8. fio - IO测试工具

    目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的 ...

  9. stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory

    今天在新电脑上安装虚拟机的时候,尝试打开hadoop和hbase,hadoop打开没有问题,就是hbase关闭的时候报了stopping hbasecat:/tmp/hbase-root-master ...

  10. [OC] 链式语法

    我们新建了一个类,叫做 OJClass (这可以是 ViewController,UIView,NSObject 等各种类型的类,这里我们把它以UIView进行举例) 现在我们想要用链式语法的方式来设 ...