首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MutationObserver 方法

MutationObserver 方法

作者头像
全栈程序员站长
发布2022-11-17 15:17:35
发布2022-11-17 15:17:35
9800
举报

大家好,又见面了,我是你们的朋友全栈君。

MutationObserver 是什么

MutationObserver API 让我们能监听 DOM 树变化,该 API 设计用来替换掉在 DOM 3 事件规范中引入的 Mutation events。

Mutation events 是同步触发的,每次变动都会触发一次调用。 MutationObserver API 是异步触发的, DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。所以 MutationObserver 相比 Mutation events 性能要更高。

代码示例

代码语言:javascript
复制
// 某个需要被监控的 dom 元素。
var targetNode = document.getElementById('elem-id');
//配置 dom 的哪些改变会触发回调函数,详细见下文表格。
var mutationObserverInitConfig = { 
 attributes: true, childList: true, subtree: true };
// dom 变化时触发的回调函数,传入 mutationsList:记录 dom 变化的对象数组。
var callback = function(mutationsList) { 

for(var mutation of mutationsList) { 

console.log( 'dom 变化啦!');
youCoreFun();
}
};
// 创建一个 MutationObserver 示例,传入回调函数
var observer = new MutationObserver(callback);
// 注册监控的节点、监控的事件
observer.observe(targetNode, mutationObserverInitConfig);
// 停止监控
observer.disconnect();

MutationObserver 允许我们订阅某个dom元素的某些事件变化:

初始化

代码语言:javascript
复制
var callback = function(mutationsList) { 

// mutationsList:数组类型的通知队列,其元素 MutationRecord 记录触发变化的详细信息。
// mutationsList:[MutationRecord,MutationRecord]
};
var observer = new MutationObserver(callback);

MutationRecord

每次 dom 变动都会触发通知,合理利用 MutationRecord 进行条件判断,避免执行不必要的 callback 操作。

属性

描述

type

根据变动类型的不同,值可能性:attributes,characterData、childList

target

触发通知的DOM节点

addedNodes

被添加的节点

removedNodes

被删除的节点

previousSibling

被添加或被删除的节点的前一个兄弟节点

nextSibling

被添加或被删除的节点的后一个兄弟节点

attributeName

发生变更的属性的名称

attributeNamespace

发生变更的属性的命名空间

oldValue

果 type 为 characterData,则返回该节点变化之前的文本数据;如果 type为 childList,则返回 null

方法详解

observe(dom,configObj)

代码语言:javascript
复制
observer.observe(targetNode, { 

attributes: true,
childList: true,
subtree: true
});

调用 observe 后开始接收通知,触发初始化 MutationObserver 实例时传入的回调函数。

mutationObserverInit 字典

MutationObserver 配置信息,observe 函数的第二个入参,对象类型。

属性

类型

描述

默认值

childList

Boolean

观察子节点变动

false

subtree

Boolean

观察所有后代节点的变动

false

attributes

Boolean

观察属性的变动

false

attributeFilter

Array

属性过滤器,例如:传入[“status”],仅在属性 status 变化时触发回调

attributeOldValue

Boolean

是否记录 attributes 变动前的属性值

characterData

Boolean

观察字符数据的变化

characterDataOldValue

Boolean

是否记录 characterData 变动前的属性值

注意

  • childList 和 subtree 指定了监视范围(子节点或者所有后代节点),attributes 和 characterData 配置是否在监视范围内监控目标节点属性、文本的变化。
  • childList,attributes 或者 characterData 三个属性之中,至少有一个必须为 true,否则会抛出 TypeError 异常。

disconnect()

代码语言:javascript
复制
observer.disconnect();

告诉观察者停止观察变动。 可以通过调用其observe()方法来重用观察者。所有已经检测到但是尚未向观察者报告的变动都会被丢弃。

takeRecords()

代码语言:javascript
复制
observer.takeRecords();

除了被动等待变化事件通知,我们还可以使用 takeRecords 函数主动从 通知队列中拉取所有待处理的通知。

需要注意的是调用 takeRecords 函数后,通知队列为空,不会触发回调函数。

takeRecords例子

浏览器兼容性

不兼容的浏览器可以使用旧 API Mutation events 作为替代方案。

参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234167.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MutationObserver 是什么
  • 代码示例
  • 初始化
  • 方法详解
    • observe(dom,configObj)
      • mutationObserverInit 字典
    • disconnect()
    • takeRecords()
  • 浏览器兼容性
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档