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

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. zabbix中文显示乱码解决

    问题zabbix使用中文显示,"监测-->图形"查看资源使用情况时会有乱码 解决问题1.修改配置文件(文件位置:$zabbix_path/include/defines.in ...

  2. 实验室服务器运维踩坑o.0

    先说背景:实验室新配了一台Dell T640服务器,双3090, 512G内存, 5 x 8T硬盘(RAID5),2 x 1T固态(RAID1),配置很够用但就是搭建运维踩了很多坑,以下是主要完成的几 ...

  3. homebrew 安装node 切换node版本

    注意:如果之前使用brew install node安装过node,需要先执行brew unlink node来'解绑'node 1.查找可用的node版本 brew search node 2.安装 ...

  4. shopt 内置命令启用shell选项 (extglob)

    使用shopt 内置命令启用shell选项 (extglob) 则会识别几个扩展模式匹配运算符 模式列表是由 | 分割 查看shell选项 extglob shopt |grep extglob 启动 ...

  5. Vue 局部过滤器和全局过滤器

    Vue 过滤器总结: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理) 语法: 1.注册过滤器: Vue.filter(name,callback) 或 new Vue{filt ...

  6. Luogu7912

    初中同学问我咋做,所以就写了一份题解. 先摆复杂度:均摊 \(O(n)\). 考虑,如果我们每次操作的复杂度都与输出量同阶,而输出量总量 \(O(n)\),则复杂度得到均摊. 于是我们现在要设计一个算 ...

  7. flutter-android

    多端开发框架 含义:通过一套代码编译成在 H5/微信小程序/React Native/百度小程序/支付宝小程序等端运行的代码. 技术简介:Taro,uniapp Taro是一个开放式跨端跨框架解决方案 ...

  8. Kubernetes--创建Ingress资源

    创建Ingress资源 Ingress资源是基于HTTP虚拟主机或URL的转发规则,它在资源配置清单的spec字段中嵌套了rules.backend和tls等字段进行定义.下面的示例中定义了一个Ing ...

  9. Linux常用指令1

    1.文件和目录的相关指令: ·cd:打开 ·pwd:查看当前所在的目录 ·mkdir:新建目录 ·rmdir:删除目录 ·ls:文件和目录查看 ·cp:复制 ·rm:删除 ·mv:移动 2.文本文件内 ...

  10. 解决tomcat8080端口占用问题

    解决tomcat8080端口占用问题 1. 使用管理员权限打开cmd 2. 输入 netstat -ano | findstr 8080 找出占用8080端口的进程pid netstat -ano | ...