前端JavaScript中MutationObserver:监测DOM变化的强大工具

2023-09-16 22:00:00

 🎬 岸边的风:个人主页

 🔥 个人专栏 :《 VUE 》 《 javaScript 》

⛺️ 生活的理想,就是为了理想的生活 !

在这里插入图片描述

目录

引言

1. MutationObserver简介

2. MutationObserver的属性

3. MutationObserver的应用场景

3.1 动态内容加载

3.2 表单验证

3. 响应式布局

3.4 自定义组件开发

4. 使用MutationObserver的示例

4.1 监测元素属性变化

4.2 监测子元素的添加或移除

4.3 监测文本节点的内容变化

5. MutationObserver的浏览器兼容性

6. 总结


引言

在Web开发中,操作和监测DOM元素的变化是一项常见的任务。MutationObserver是JavaScript提供的一个强大的API,用于异步监测DOM树的变化,并在发生变化时执行相应的操作。本文将详细介绍MutationObserver的属性、应用场景以及使用示例,帮助读者充分理解和应用这一强大的工具。

1. MutationObserver简介

MutationObserver是一个JavaScript的API,用于监测DOM树的变化。它提供了一种异步的方式来监听DOM元素的增加、删除、属性变化等操作,以及文本节点的修改。通过MutationObserver,开发者可以实时地捕捉到DOM的变化,并做出相应的响应。

MutationObserver是在2012年引入的,目前被广泛支持的浏览器(包括Chrome、Firefox、Safari、Edge等)都提供了对MutationObserver的支持。

2. MutationObserver的属性

MutationObserver提供了一些属性,用于配置和控制观察器的行为。下面是一些常用的属性:

  • attributes:是否监测元素的属性变化。
  • attributeOldValue:是否在属性变化时记录旧值。
  • attributeFilter:指定要监测的属性列表。
  • childList:是否监测子元素的添加或移除。
  • subtree:是否监测后代元素的变化。
  • characterData:是否监测文本节点的内容变化。
  • characterDataOldValue:是否在文本节点内容变化时记录旧值。

通过这些属性,可以灵活地配置MutationObserver的观察行为,以满足不同的需求。

3. MutationObserver的应用场景

MutationObserver在许多场景下都能发挥重要作用。下面是一些常见的应用场景:

3.1 动态内容加载

当页面中的内容是通过异步加载或动态生成时,可以使用MutationObserver来监测内容的变化,并在变化发生后进行相应的处理,如更新页面布局、添加事件监听器等。例如,在无限滚动加载的场景中,当新的内容被加载到页面时,可以使用MutationObserver来自动监听内容的变化,并在变化发生后动态添加相应的元素或事件。

3.2 表单验证

当需要实时验证用户输入时,可以使用MutationObserver来监测表单元素的变化,以及对应的属性变化,如值的变化、禁用状态的变化等。这样可以及时地对用户的输入进行验证和反馈。例如,在一个表单中,当用户输入时,可以使用MutationObserver来监测输入框的值变化,并在值变化后进行实时的表单验证。

3. 响应式布局

当页面布局需要根据DOM变化自适应调整时,可以使用MutationObserver来监测相关元素的变化,并根据变化动态地调整页面布局。例如,在响应式网页设计中,当窗口大小发生变化或元素被添加或移除时,可以使用MutationObserver来监听相关元素的变化,并根据变化重新计算和调整页面布局,以适应不同的设备和屏幕尺寸。

3.4 自定义组件开发

在自定义组件的开发中,MutationObserver可以用于监听组件内部的DOM变化,以及对应的属性变化。这样可以在组件内部做出相应的处理,如更新组件的状态、重新渲染组件等。例如,当一个自定义组件中的某个子元素被添加或移除时,可以使用MutationObserver来监听这些变化,并在变化发生后更新组件的状态或重新渲染组件。

4. 使用MutationObserver的示例

下面通过几个示例来演示如何使用MutationObserver进行DOM变化的监测。

4.1 监测元素属性变化

下面的示例代码演示了如何使用MutationObserver监测元素的属性变化,并在变化发生后进行相应的处理:

// 目标元素
const targetElement = document.querySelector('#target');

// 创建一个MutationObserver实例
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.type === 'attributes') {
      console.log(`属性 ${mutation.attributeName} 发生变化`);
      // 执行相应的处理逻辑
    }
  });
});

// 配置观察器
const config = {
  attributes: true,
};

// 启动观察器
observer.observe(targetElement, config);

在上述代码中,我们首先选择了一个目标元素,然后创建了一个MutationObserver实例。接下来,我们配置了观察器,指定我们要监测的变化类型为属性变化。最后,我们通过调用observe方法,将观察器绑定到目标元素上。

当目标元素的属性发生变化时,MutationObserver的回调函数将被调用,并传递一个mutations参数,该参数包含了所有发生的变化。在回调函数中,我们可以根据变化的类型(mutation.type)来判断具体的变化类型,并执行相应的处理逻辑。

4.2 监测子元素的添加或移除

下面的示例代码演示了如何使用MutationObserver监测子元素的添加或移除,并在变化发生后进行相应的处理:

// 目标元素
const targetElement = document.querySelector('#target');

// 创建一个MutationObserver实例
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.type === 'childList') {
     

 mutation.addedNodes.forEach((addedNode) => {
        console.log(`添加了子元素:${addedNode.nodeName}`);
        // 执行相应的处理逻辑
      });

      mutation.removedNodes.forEach((removedNode) => {
        console.log(`移除了子元素:${removedNode.nodeName}`);
        // 执行相应的处理逻辑
      });
    }
  });
});

// 配置观察器
const config = {
  childList: true,
};

// 启动观察器
observer.observe(targetElement, config);

在上述代码中,我们创建了一个MutationObserver实例,并将观察器配置为监测子元素的添加或移除。当目标元素的子元素发生添加或移除操作时,MutationObserver的回调函数将被调用,并传递一个mutations参数,该参数包含了所有发生的变化。在回调函数中,我们可以根据变化的类型(mutation.type)为childList来判断子元素的添加或移除操作,并执行相应的处理逻辑。

4.3 监测文本节点的内容变化

下面的示例代码演示了如何使用MutationObserver监测文本节点的内容变化,并在变化发生后进行相应的处理:

// 目标元素
const targetElement = document.querySelector('#target');

// 创建一个MutationObserver实例
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.type === 'characterData') {
      console.log(`文本节点内容发生变化:${mutation.target.nodeValue}`);
      // 执行相应的处理逻辑
    }
  });
});

// 配置观察器
const config = {
  characterData: true,
};

// 启动观察器
observer.observe(targetElement, config);

在上述代码中,我们创建了一个MutationObserver实例,并将观察器配置为监测文本节点的内容变化。当目标元素的文本节点的内容发生变化时,MutationObserver的回调函数将被调用,并传递一个mutations参数,该参数包含了所有发生的变化。在回调函数中,我们可以根据变化的类型(mutation.type)为characterData来判断文本节点的内容变化,并执行相应的处理逻辑。

5. MutationObserver的浏览器兼容性

MutationObserver已经在大多数现代浏览器中得到支持,包括Chrome、Firefox、Safari、Edge等。然而,考虑到一些老旧的浏览器版本,建议在使用MutationObserver之前,检查浏览器的兼容性。

可以通过以下链接查看MutationObserver的浏览器兼容性信息:

6. 总结

MutationObserver是一个强大的工具,用于监测DOM树的变化。通过MutationObserver,我们可以异步地监听DOM元素的增加、删除、属性变化等操作,并在发生变化时执行相应的操作。它在动态内容加载、表单验证、响应式布局、自定义组件开发等场景下发挥重要作用。本文介绍了MutationObserver的属性、应用场景以及使用示例,

更多推荐

HTML5 游戏开发实战 | 俄罗斯方块

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏看似简单但却变化无穷,游戏过程仅需要玩家将不断下落的各种形状的方块移动、翻转,如果某一行被方块充满了,那就将这一行消掉;而当窗口中无法再容纳下落的方块时,就宣告游戏结束。可见俄罗斯方块的需求如下。(

AI+游戏线下沙龙活动暨COC上海城市开发者社区8月活动

引言近年来,随着人工智能技术的不断发展和游戏开发技术的不断更新,越来越多的游戏公司开始将人工智能技术应用于游戏领域,以提高开发效率、降低成本,实现游戏玩家更好的游戏体验。为了探讨AI+游戏的技术实践经验,近日在亚马逊会议中心举办了一场以AI+游戏为主题的技术研讨会。在AI+游戏的技术实践研讨会上,与会者们分享了一些关于

云游戏下,会带来哪些技术变革

云游戏前言元宇宙是什么?云游戏的福利云游戏包括哪些技术前言大家好,在这里给大家介绍一个新名词----云游戏。可能有一些小伙伴了解过一些,也有一些小伙伴可能没有了解过,那这里就带大家了解一下元宇宙里的云游戏。2023年,如果说到什么最火🔥,什么最流行,那肯定是非元宇宙莫属了。自从2021年来,元宇宙就如同那雨后春笋一样

方案:数智化视频AI技术为智慧防汛筑基,构建防汛“数字堤坝”

一、背景分析在过去的几年中,全球气候变化导致许多城市在雨季面临严重的洪涝灾害。这些灾害不仅对人们的生命安全和财产造成威胁,也影响了城市的正常运转。传统的防汛手段主要依赖人力监控和应急指挥,但存在响应速度慢、处理效率低等问题。因此,我们需要一种智能、高效的解决方案来提高防汛效率和降低洪涝灾害的影响。随着新一代信息技术的普

【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?

作者主页:Designer小郑作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。主打方向:Vue、SpringBoot、微信小程序本文讲解了Java中集合类LinkedList的语法、使用说明和应用场景,并给出了样例代码。目录一、什么是Lin

[C++入门]---List的使用及模拟实现

文章目录1.list的介绍2.list的使用2.1list的构造函数2.2listmodifiers2.3listcapacity2.4listelmentaccess2.5iterator的使用3.list的模拟实现3.1list的源码1.list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,

【Java 基础篇】深入理解Java HashMap:使用注意事项和性能优化

Java是一种广泛使用的编程语言,而集合是Java编程中不可或缺的一部分。在Java的集合框架中,HashMap是一个常用的数据结构,用于存储键值对。本文将深入介绍HashMap集合,从基础到高级用法,帮助您更好地理解和利用它。什么是HashMap?HashMap是Java集合框架中的一个类,它实现了Map接口,用于存

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows大家好我是艾西,最近研究了下l4d2(求生之路2)这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游戏每一个人的梦想,在自己的服务器里为所欲为在游戏里成就自己。(注:因PT原因本文

RocketMQ消息的分类

一、普通消息1消息发送分类Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。同步发送消息同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。异步发送消息异步发送消息是指,Producer发出消息后无需等待

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录一、页面跳转间的传统的数据传递方式1、传统的数据传递方式-Bundle传递数据1、Navigation组件中的Bundle数据传递2、传统数据传递实现步骤3、FragmentA完整代码示例4、FragmentB完整代码示例5、执行结果2、使用Bundle传递数据安全性差二、页面跳转间的传统的数据传递方式1、导入

C++--哈希表的实现及unorder_set和unorder_map的封装

1.什么是哈希表哈希表是一种数据结构,用来存放数据的,哈希表存放的数据是无序的,可以实现增删查,当时不能修改数据。可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。该

热文推荐