MutationObserver 用法总结( 监听节点、DOM变化 )

一、认识MutationObserver

今天在查看Event Loop相关的文章的时候,看见了MutationObserver类,然后自己看了一下,在这做下总结

MutationObserver:原生api中用来监听node节点变化的一个类,用来代替Mutation Events
我们先来看看MutationObserver中有哪些方法 我们使用dir函数输出一下
在这里插入图片描述
我们可以看到MutationObserver中有三个方法,我们一一来看
1、observe

observe(target, config):
target:需要监听的元素 [element]
config:需要监听的属性 [Object] 例如 attributes \ childList等 后期会详细讲到

我们来尝试一下这个方法,作者只写了js代码,你们需要自己在页面添加box这个元素

let box = document.querySelector('#box'),
  config = { attributes: true };

/*
* 在我们创建MutationObserver对象的时候可以传入一个函数,
* 
*/
let observer = new MutationObserver(mutations => {
  console.log(mutations) 
  // => 返回一个我们监听到的MutationRecord对象
  // MutationRecord对象 是我们每修改一个就会在数组里面追加一个
})

observer.observe(box, config) // 监听的 元素 和 配置项
box.setAttribute('name','张三')// 修改属性
box.style.background = 'black'// 修改样式

我们运行上面代码,可以看到输出结果,返回了一个集合 集合中有两个MutationRecord对象
在这里插入图片描述
我们再来展开看看里面有什么

我们现在先关心有值的几项
attributeName:我们设置 属性 的 属性名
type:我们修改的类型

在这里插入图片描述
我们再来看看第二个 ,除了属性名
在这里插入图片描述

2、disconnect

停止MutationObserver对象的观察,且清空所有的MutationRecord对象

let observer = new MutationObserver(mutations => {
  console.log(mutations)
})

observer.observe(box, config)
box.setAttribute('name','张三')

observer.disconnect() // 我们将方法disconnect在这里进行执行

box.style.background = 'black'

可以看到我们在设置 name 属性后再执行的 disconnect 我们应该会输出得到含有一个MutationRecord对象的数组
在这里插入图片描述
但是我们查看控制台 上面什么都没有输出,这是为什么呢?
这是因为我们在new MutationObserver传入的函数并不会监听到修改了就立即执行,而是等到同步代码都执行完了,才会去调用我们传入的回调函数
三、takeRecords

MutationObserver的通知队列中删除所有待处理的通知,并将它们返回到MutationRecord对象的新Array中

我们直接看代码

let observer = new MutationObserver(mutations => {
  console.log(mutations)
})

observer.observe(box, config)
box.setAttribute('name', '张三')

let arr = observer.takeRecords() 
// 获取队列中未处理的,
// 这个方法是同步执行,可以即时获取
console.log(arr) 

box.style.background = 'black'

在这里插入图片描述

二、MutationObserver可以监听的属性(配置)

MutationObserver配置项也叫MutationObserverInit字典

属性说明默认值
attributes设为 true 以观察受监视元素的属性值变更。默认值为 false。
attributeFilter要监视的特定属性名称的数组。如果未包含此属性,则对所有属性的更改都会触发变动通知。无默认值。
characterData设为 true 以监视指定目标节点或子节点树中节点所包含的字符数据的变化。无默认值
childList设为 true 以监视目标节点(如果 subtree 为 true,则包含子孙节点)添加或删除新的子节点。默认值为 false。
subtree的其他值也会作用于此子树下的所有节点,而不仅仅只作用于目标节点。默认值为 false。

作者这里把大家可能会用到的列举了出来,如果大家要查看全部,可在 MutationObserverInit 查看.

  • 21
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网页开发中,经常需要监听 DOM 元素的大小变化,以便进行动态布局或其他操作。而 JavaScript 提供了一种方便的方法来实现 DOM 元素大小变化监听。 首先,要监听 DOM 元素的大小变化,需要知道 DOM 元素的尺寸。获取 DOM 元素的尺寸可以通过其属性和方法来实现。比如,可以通过元素的 clientWidth 和 clientHeight 属性获取其内容区域的宽度和高度。 然后,要监听 DOM 元素大小的变化,可以使用 MutationObserver API。MutationObserver API 是浏览器提供的一种用于监听 DOM 变化的 API,它可以监听 DOM 元素的属性、子节点变化,并在这些变化发生时触发回调函数。 使用 MutationObserver API 监听 DOM 元素大小变化的步骤如下: 1. 创建一个 MutationObserver 对象。 2. 使用 MutationObserver.observe 方法监听目标 DOM 元素的变化。 3. 在回调函数中判断 DOM 元素的尺寸是否发生了变化。 4. 如果尺寸发生变化,则进行相应的操作。 例如,以下代码可以实现监听某个元素宽度变化并输出宽度变化的值: ``` const target = document.querySelector('#target'); const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'style') { const width = target.clientWidth; console.log(`Width changed to ${width}`); } }); }); observer.observe(target, { attributes: true }); ``` 最后,需要注意的是,使用 MutationObserver 监听 DOM 元素大小的变化虽然方便,但也存在一些限制,例如对于表格的大小变化无法捕获等,需要根据实际情况选择合适的方法来实现 DOM 元素大小的监听
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值