javascript基础学习系列四百一十八:MutationObserver 接口

本文详细介绍了MutationObserver接口,用于在DOM结构改变时异步执行回调,涵盖观察范围、配置选项、回调处理和MutationRecord实例的属性。
摘要由CSDN通过智能技术生成

不久前添加到 DOM 规范中的 MutationObserver 接口,可以在 DOM 被修改时异步执行回调。使用 MutationObserver 可以观察整个文档、DOM 树的一部分,或某个元素。此外还可以观察元素属性、子节点、文本,或者前三者任意组合的变化。
基本用法
MutationObserver 的实例要通过调用 MutationObserver 构造函数并传入一个回调函数来创建:

observe()方法
新创建的 MutationObserver 实例不会关联 DOM 的任何部分。要把这个 observer 与 DOM 关联起来,需要使用 observe()方法。这个方法接收两个必需的参数:要观察其变化的 DOM 节点,以及一个 MutationObserverInit 对象。
MutationObserverInit 对象用于控制观察哪些方面的变化,是一个键/值对形式配置选项的字典。
例如,下面的代码会创建一个观察者(observer)并配置它观察元素上的属性变化:

observer.observe(document.body, { attributes: true }); 

执行以上代码后,元素上任何属性发生变化都会被这个 MutationObserver 实例发现,然后就会异步执行注册的回调函数。元素后代的修改或其他非属性修改都不会触发回调进入任务
队列。可以通过以下代码来验证:

observer.observe(document.body, { attributes: true }); 
document.body.className = 'foo'; 
console.log('Changed body class'); 
// Changed body class 
// <body> attributes changed 

注意,回调中的 console.log()是后执行的。这表明回调并非与实际的 DOM 变化同步执行。
回调与 MutationRecord每个回调都会收到一个 MutationRecord 实例的数组。MutationRecord 实例包含的信息包括发生了什么变化,以及 DOM 的哪一部分受到了影响。因为回调执行之前可能同时发生多个满足观察条件的事件,所以每次执行回调都会传入一个包含按顺序入队的 MutationRecord 实例的数组。
下面展示了反映一个属性变化的 MutationRecord 实例的数组:

 (mutationRecords) => console.log(mutationRecords));
observer.observe(document.body, { attributes: true }); 
document.body.setAttribute('foo', 'bar'); 
// [ 
// { 
// addedNodes: NodeList [],
// attributeName: "foo", 
// attributeNamespace: null, 
// nextSibling: null, 
// oldValue: null, 
// previousSibling: null 
// removedNodes: NodeList [], 
// target: body 
// type: "attributes" 
// } 
// ] 

下面是一次涉及命名空间的类似变化:

 (mutationRecords) => console.log(mutationRecords)); 
observer.observe(document.body, { attributes: true }); 
document.body.setAttributeNS('baz', 'foo', 'bar'); 
// [ 
// { 
// addedNodes: NodeList [], 
// attributeName: "foo", 
// attributeNamespace: "baz", 
// nextSibling: null, 
// oldValue: null, 
// previousSibling: null 
// removedNodes: NodeList [], 
// target: body 
// type: "attributes" 
// } 
// ] 

连续修改会生成多个 MutationRecord 实例,下次回调执行时就会收到包含所有这些实例的数组,顺序为变化事件发生的顺序:

 (mutationRecords) => console.log(mutationRecords)); 
observer.observe(document.body, { attributes: true }); 
document.body.className = 'foo'; 
document.body.className = 'bar'; 
document.body.className = 'baz'; 
// [MutationRecord, MutationRecord, MutationRecord] 

下表列出了 MutationRecord 实例的属性

target 被修改影响的目标节点
type 字符串,表示变化的类型:"attributes"、"characterData"或"childList"
oldValue 如果在 MutationObserverInit 对象中启用(attributeOldValue 或 characterData OldValue
为 true),"attributes"或"characterData"的变化事件会设置这个属性为被替代的值
"childList"类型的变化始终将这个属性设置为 null
attributeName 对于"attributes"类型的变化,这里保存被修改属性的名字
其他变化事件会将这个属性设置为 null
attributeNamespace 对于使用了命名空间的"attributes"类型的变化,这里保存被修改属性的名字
其他变化事件会将这个属性设置为 null
addedNodes 对于"childList"类型的变化,返回包含变化中添加节点的 NodeList
默认为空 NodeList
removedNodes 对于"childList"类型的变化,返回包含变化中删除节点的 NodeList
默认为空 NodeList
previousSibling 对于"childList"类型的变化,返回变化节点的前一个同胞 Node 
默认为 null
nextSibling 对于"childList"类型的变化,返回变化节点的后一个同胞 Node
默认为 null

传给回调函数的第二个参数是观察变化的 MutationObserver 的实例,演示如下:

 (mutationRecords, mutationObserver) => console.log(mutationRecords,
mutationObserver)); 
observer.observe(document.body, { attributes: true }); 
document.body.className = 'foo'; 
// [MutationRecord], MutationObserver
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HTML DOM,即HTML文档对象模型,是一种用于访问和操作HTML文档中元素的标准方法。在JavaScript中,可以使用DOM来查找、修改、添加和删除HTML元素。在本教程中,我们将学习如何使用DOM来操作HTML文档的元素。 ### 回答2: JavaScript学习手册十四:HTML DOM——文档元素的操作(二)介绍了文档元素的一些高级操作,包括插入和删除节点、替换节点、复制节点等。下面我将详细介绍这些操作的用法和注意事项。 首先是插入节点,包括appendChild()和insertBefore()方法。appendChild()方法可以将一个节点追加到某个元素的子节点列表的末尾,而insertBefore()方法可将一个节点插入到元素的指定位置。这两个方法都可以接收字符串、元素、文本节点等参数,可以将它们转换为节点后插入。需要注意的是,插入节点后必须重新获取元素才能正确地操作修改后的DOM树。 接下来是删除节点,包括removeChild()和replaceChild()方法。removeChild()方法可以移除指定节点,replaceChild()方法则可将指定节点替换为另一个节点。调用这两个方法也需要重新获取元素。 另外,还有cloneNode()和hasChildNodes()方法。cloneNode()方法可以复制一个节点,包括节点的属性、事件、插入的子节点等,但不包括子节点的引用和事件处理程序。hasChildNodes()方法可判断节点是否包含子节点。 需要注意的是,在使用这些高级DOM操作时,应尽可能减少DOM的操作次数。因为频繁操作DOM可能会导致性能问题,因此应该尽可能缓存和重用DOM元素,同时避免频繁更新DOM。此外,在修改DOM树时,应当小心操作,避免影响网页布局和用户体验。 总之,JavaScript学习手册十四:HTML DOM——文档元素的操作(二)提供了一些高级操作DOM树的方法,可以方便地插入、删除、替换和复制节点。合理地使用这些方法,可以为网页的构建、交互和流畅度提供帮助。 ### 回答3: HTML DOM是JavaScript操作HTML和XML的接口,它将HTML和XML文档表示为具有层次结构的节点树,通过对节点树进行操作,可以实现对文档元素的增删改查。之前我们已经学习了文档元素的遍历和属性的操作,本篇文章将进一步介绍如何对文档元素进行插入、替换和移除操作。 文档元素的插入操作,可以通过createElement()方法创建一个元素节点,然后通过appendChild()将该节点插入到指定的父节点下。还可以使用insertBefore()方法在指定位置插入节点,该方法需要指定要插入的节点和插入位置的参考节点。同时还可以使用insertAdjacentHTML()方法直接插入HTML代码并将其转换为节点。 文档元素的替换操作,可以通过replaceChild()方法实现,该方法需要指定要替换的节点和替换后的新节点。替换操作可以用于更新页面中的元素,比如将旧的图片替换成新的图片等。 文档元素的移除操作,可以通过removeChild()方法实现,该方法需要指定要移除的节点,并将其从父元素节点中删除。还可以使用remove()方法直接将元素节点从页面中删除。 在进行文档元素操作时,需要注意避免对页面结构造成破坏,比如插入重复的元素或删除父元素节点等操作。另外,DOM操作可能会影响页面的性能,因此在实际应用中需要谨慎处理。 总的来说,HTML DOM提供了丰富的接口,可以实现对文档元素的灵活操作,帮助我们更好地控制和管理页面内容。对于Web前端开发者而言,熟练掌握HTML DOM操作技巧是非常重要的一项技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值