首页 > 其他分享 >Dom-API | MutationObserver使用方法详解

Dom-API | MutationObserver使用方法详解

时间:2024-07-29 23:30:41浏览次数:15  
标签:observer Dom MutationObserver childList API mutation true 节点

MutationObserver 介绍

MutationObserver 是是一个用于监视 DOM 变动的 Web API。通过它可以监控 DOM 树中的更改,比如元素的属性、子元素的增加和删除等,并在这些变化发生时执行回调函数。可以替代过时的 Mutation Events,它具有更高的性能和更广的适用性。

使用步骤详细说明

1. 创建观察者实例

MutationObserver 构造函数接收一个回调函数,当观察到 DOM 变化时,这个回调函数会被调用。

const observer = new MutationObserver((mutationsList, observer) => {
    // 遍历所有的 MutationRecord 对象
    mutationsList.forEach(mutation => {
        switch(mutation.type) {
            case 'childList':
                console.log('A child node has been added or removed.');
                console.log('Added nodes:', mutation.addedNodes);
                console.log('Removed nodes:', mutation.removedNodes);
                break;
            case 'attributes':
                console.log(`The ${mutation.attributeName} attribute was modified.`);
                break;
            case 'characterData':
                console.log('The character data has changed.');
                break;
        }
    });
});

2. 定义观察选项

observe 方法的第二个参数是一个配置对象,用于指定观察的类型和范围。

const config = { 
    attributes: true,           // 监视属性的变化
    childList: true,            // 监视子节点的变化
    subtree: true,              // 监视整个子树
    characterData: true,        // 监视节点内容或文本的变化
    attributeOldValue: true,    // 记录属性变化前的值
    characterDataOldValue: true // 记录文本内容变化前的值
};

3. 选择要观察的目标节点

目标节点是希望监视其变动的 DOM 元素。

const targetNode = document.getElementById('someElementId');

4. 开始观察目标节点

调用 observe 方法开始观察目标节点。

observer.observe(targetNode, config);

5. 停止观察

当不再需要观察时,可以调用 disconnect 方法停止观察。

observer.disconnect();

MutationRecord 对象详解

每个 MutationRecord 对象表示一个检测到的变化。其属性如下:

  • type: 变化的类型,可以是 "attributes"、"characterData" 或 "childList"。
  • target: 变化所影响的目标节点。
  • addedNodes: 一个包含所有新添加的子节点的 NodeList
  • removedNodes: 一个包含所有被移除的子节点的 NodeList
  • previousSibling: 被添加或移除节点的前一个兄弟节点。
  • nextSibling: 被添加或移除节点的下一个兄弟节点。
  • attributeName: 变化的属性的名称。
  • attributeNamespace: 变化的属性的命名空间。
  • oldValue: 属性或字符数据的先前值(如果配置中指定了 attributeOldValuecharacterDataOldValue)。

实用场景及高级技巧

1. 动态内容加载

可以用于监控动态加载内容的变化。例如,监视 AJAX 请求插入的内容。

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

2. 表单自动保存

监控表单元素的变化并自动保存用户输入的数据。

const formObserver = new MutationObserver((mutationsList, observer) => {
    // 保存表单数据逻辑
});
formObserver.observe(document.querySelector('form'), { attributes: true, childList: true, subtree: true });

3. 动态调整页面布局

根据 DOM 的变化动态调整页面布局或内容。

const layoutObserver = new MutationObserver((mutationsList, observer) => {
    // 动态调整布局逻辑
});
layoutObserver.observe(document.getElementById('dynamicContent'), { childList: true, subtree: true });

性能考虑

尽管 MutationObserver 性能优于 Mutation Events,但在处理大量变动时仍需谨慎。避免过多的 DOM 操作和复杂的回调函数逻辑,可以使用 debouncethrottle 技术优化性能。

示例代码:动态加载内容监视

const contentObserver = new MutationObserver((mutationsList, observer) => {
    mutationsList.forEach(mutation => {
        if (mutation.type === 'childList') {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) { // 确保是元素节点
                    console.log('New element added:', node);
                    // 这里可以添加处理新加载内容的逻辑
                }
            });
        }
    });
});

const config = { childList: true, subtree: true };
contentObserver.observe(document.body, config);

通过这些详细的步骤和示例代码,可以更深入地理解和应用 MutationObserver,从而实现对 DOM 变化的高效监控和处理。

参考文章

JS MutationObserver(JS变动观察器)

标签:observer,Dom,MutationObserver,childList,API,mutation,true,节点
From: https://www.cnblogs.com/echohye/p/18331278

相关文章

  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • 【Azure APIM】调用APIM的备份接口时候遇见Authentication Failed错误
    问题描述在之前博文中介绍使用SystemManagedIdentity执行APIM备份到StorageAccount的操作时,突然遇见了AuthenticationFailed,详细的错误信息显示证书过期。{"error":{"code":"BadRequest","message":"AuthenticationFailed:Aconfigur......
  • 02 Go语言开发REST API接口_20240728 课程笔记
    概述如果您没有Golang的基础,应该学习如下前置课程。Golang零基础入门Golang面向对象编程GoWeb基础基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。视频课程最近发现越来越多的......
  • Python - Using a list with functions from the random module
    Toselectarandomitemfromthelistorshufflethelist,youcanusethechoiceandshufflefunctionsfromtherandommoduleofthestandardlibrary.Therandom.choice()functionreturnsarandomlyselectedelementfromthelist.>>>importran......
  • Java中的常见类(API)---java基础的五弹
    文章目录Java基础知识全解第五弹常用类一、String类1.判断功能的方法2.获取功能的方法3.转换功能的方法4.分割功能的方法5.其他常用方法二、StringBuilder1.字符串拼接2.StringBuffer3.StringBuilder三.Math类四.Random类五.System类六.包装类1.概述2.......
  • 论文阅读:Borrowing wisdom from world: modeling rich external knowledge for Chines
    问题定义由于词级中文NER存在第三方解析器分割的边界错误,因此考虑将字符级NER作为默认设置。使用'BMES'标记方案进行字符级NER,将标记表述为序列标记问题。即,对于句子\(s={c_1,...,c_n}\)中的每个字符\(c_i\),使用标签集中的标签进行标记\(L={B,M,E,S,O}\)。O:非实体元素B:实......
  • Pentester Academy -Windows API Exploitation Recipes: Processes, Tokens and Memor
    早年为PentesterAcademy(https://www.pentesteracademy.com/),如今为INE(https://ine.com/)002安装VS社区版https://visualstudio.microsoft.com/zh-hans/003processlistingapi正在运行的是什么:服务,AV,HIDS/IPS等其他attack开始的点:进程注入,内存dump/修改,TokenSt......
  • 纳米体育数据API电竞数据API:资料库数据包接口文档API示例⑤
    纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本包含http协议以及websocket协议,主要通过http获取数......
  • 【阿里云】通过OpenAPI获取Token(C#)
    使用C#实现https://help.aliyun.com/zh/isi/getting-started/use-http-or-https-to-obtain-an-access-tokenpublicstaticclassTokenHelper{publicstaticasyncTask<string>GetAccessTokenAsync(stringaccessKeyId,stringaccessKeySecret){......
  • 免费版ChatGPT API Key生成指南
    当下,虽然ChatGPT已经免费开放使用,但要想在互联网上畅通无阻,仍有一些繁琐步骤。虽然网络上有许多提供GPT服务的网站,但若想自行开发应用,则需要获取一个API密钥。你可以在这个项目地址查看详细信息:https://github.com/baicaigpt/FreeGPT_FreeApiKey。在该地址,你可以直接了解如何申请......