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

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. 关于Java的惰性求值

    最近在学scala的时候,函数传参可以是传名参数,或者传值参数 1.Scala中的传名参数是什么意思?lazy关键字有什么作用? Scala官方文档的定义是:传名参数 仅在被使用时触发实际参数的求值运 ...

  2. mybatis 一级、二级缓存机制

    MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存 一级缓存是 SqlSession 级别的缓存.在操作数据库时需要构造 SqlSession 对象,在对象中有一个数据结构(HashMap)用 ...

  3. vuex状态管理器

    vuex核心概念 // vuex中一共有五个状态 State Getter Mutation Action Module import Vue from 'vue' import Vuex from ...

  4. 根据XML生成实体类

    因为对接系统的XML所需映射的实体类有几十个,自己来处理不太现实,于是一直找寻找这样的工具,终于让我发现了jaxb2-maven-plugin: http://www.mojohaus.org/jax ...

  5. Centos 7.5 MySql的安装和配置

    一.安装 三个步骤: wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y ins ...

  6. Adversarial seeded sequence growing for weakly-supervised temporal action localization概述

    0.前言 相关资料: 论文 github 论文解读 论文基本信息: 领域:弱监督时序动作定位综述 更新时间:ACM MM2019(2019.8.7) 1.针对的问题 大多数现有的框架依赖于类激活序列( ...

  7. Linux 系统挂载 ntfs 移动硬盘无法写入的问题

    linux 下挂载 ntfs 移动硬盘无法写入问题 在机房使用移动硬盘时发现无法写入硬盘,具体是 Ubuntu 21.04 ,移动硬盘是 SSD ,分区类型是 NTFS . 首先百度得知最优办法是安装 ...

  8. Ribbit Mq 实现延迟消息

    --------------------好记性不如烂笔头--------------------------- windows 环境,使用 rabbit Mq 需要安装, erl   和  rabbi ...

  9. maven 依赖包冲突解决

    maven 查看依赖树结构命令mvn dependency:tree 1.出现下面这样冲突 omitted for duplicate  因重复而省略 2.解决-- 那个项目有问题,先注释掉,在重新一 ...

  10. npm config get prefer-offline

    npm config get prefer-offline