当前位置: 首页 > wzjs >正文

网站友情链接的好处2002年网站建设公司

网站友情链接的好处,2002年网站建设公司,绵阳阡陌网站建设,佛山网站推广怎么做MutationObserver 接口DOM规范中的 MutationObserver 接口可以在DOM被修改时异步执行回调。使用MutationObserver可以观察整个文档、DOM树的一部分或某个元素,元素属性、字节点、文本等。新引进的MutationObserver接口取代了已废弃的MutationEvent。MutationObserve…

MutationObserver 接口

DOM规范中的 MutationObserver 接口可以在DOM被修改时异步执行回调。

使用MutationObserver可以观察整个文档、DOM树的一部分或某个元素,元素属性、字节点、文本等。

新引进的MutationObserver接口取代了已废弃的MutationEvent。

MutationObserver 实例

MutationObserver实例通过调用MutationObserver构造函数并传入一个回调函数创建。

新创建的MutationObserver实例,需要使用observe()方法与DOM进行关联。

observe()

两个必填参数:

要观察的DOM节点

MutationObserveInit 对象

MutationObserveInit对象用于控制观察哪些方面的变化,是一个键值对形式配置选项的字典。

回调与 MutationRecord

MutationObserver(构造函数)中的参数(回调函数),每个回调都会收到一个MutationRecord实例的数组(第一个参数),记录发生了什么变化以及DOM的哪部分收到了影响。

因为回调执行之前可能同时发生多个满足观察条件的事件,所以每次执行回调都会传入一个包含按顺序入队的MutationRecord实例的数组。

new MutationObserver(fn)

参数:回调函数fn。

回调函数fn的参数:

第一个参数:MutationRecord实例的数组

第二个参数:观察变化的MutationObserver的实例

MutationObserver 的回调函数可以多次执行。每当观察到 DOM 树的变化时,回调函数就会被调用。这些变化包括但不限于节点的添加、删除、属性的更改等。

那么问题来了

本例中,为什么回调中的 console.log 只输出了一次?

let ob = new MutationObserver(function () {console.log("%cbody attributes changed", "color: red; font-weight:bold;font-size: 20px;");
});
ob.observe(document.body, { attributes: true });
document.body.setAttribute("foo", "bar");
document.body.className = "newClass";

解答(来自通义灵码)

1.MutationObserver 是异步执行的

  • MutationObserver 的回调是通过 微任务队列(microtask queue) 异步触发的。
  • 当你在短时间内连续修改 DOM 属性时,浏览器会将这些变更合并为一个批次,并只调用一次回调函数

2. 属性变更被合并处理

  • 在你的代码中:

    document.body.setAttribute("foo", "bar"); document.body.className = "newClass";

    这两个操作都是对 document.body 的属性进行修改。
  • 因为它们在同一个事件循环中发生,所以 MutationObserver 只会收到一次“属性变化”的通知,并触发一次回调。

🧪 实验验证

如果你希望看到两次日志输出,可以使用 setTimeout 将这两个修改分开到不同的事件循环中:

document.body.setAttribute("foo", "bar"); setTimeout(() => { document.body.className = "newClass"; }, 0);

这样,MutationObserver 会在两个独立的 microtask 中检测到两次属性变更,从而触发两次回调。


✅ 总结

现象原因
console.log 只输出一次浏览器将多个 DOM 修改合并为一次变更通知,回调只执行一次
关键点说明
异步机制MutationObserver 使用微任务队列处理回调
批量优化浏览器自动合并多次变更以提升性能
控制输出次数可通过 setTimeout 或其他方式分隔变更事件

🛠️ 建议改进代码

// 分开两次 DOM 操作,确保触发两次回调 document.body.setAttribute("foo", "bar"); setTimeout(() => { document.body.className = "newClass"; }, 0);

这样就能在控制台看到两次 "body attributes changed" 的日志输出。

再记录一个通用示例

部分代码来自夸克浏览器。

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>木木的学习笔记</title><style>#target {border: 1px solid black;padding: 10px;margin-top: 10px;}</style></head><body><div class="container"><div class="navBox"></div><p>MutationObserver 的回调函数可以多次执行。每当观察到 DOM 树的变化时,回调函数就会被调用。这些变化包括但不限于节点的添加、删除、属性的更改等。</p><p>测试</p><div id="target">这是一个目标元素。</div><br /><button onclick="changeText()">改变文本</button></div><script src="./js/nav.js"></script><script>//加载页面导航var navObj = {title: "MutationObserver",chapter: "",section: "",part: "",};setNav(navObj);</script><script>// 选择需要观察变动的节点const targetNode = document.getElementById("target");// 配置观察选项const config = { childList: true, subtree: true, attributes: true, characterData: true };// 创建一个回调函数,当观察到DOM变动时会被调用const callback = function (mutationsList, observer) {console.log("DOM changed");for (let mutation of mutationsList) {if (mutation.type === "childList") {console.log("A child node has been added or removed.");} else if (mutation.type === "attributes") {console.log(`The ${mutation.attributeName} attribute was modified.`);} else if (mutation.type === "characterData") {console.log("Character data in the node has been changed.");}}};// 创建一个观察器实例并传入回调函数const observer = new MutationObserver(callback);// 开始观察目标节点observer.observe(targetNode, config);// 函数用于改变目标元素的文本内容let count = 0;function changeText() {targetNode.textContent = `文本已被第 ${++count} 次改变!`;}</script></body>
</html>

这个示例中,每次修改都被记录。

 


文章转载自:

http://dujFJcfF.ysLLp.cn
http://BhDDADei.ysLLp.cn
http://lQ3FKeZs.ysLLp.cn
http://wjDtrVSa.ysLLp.cn
http://RRpwPd9a.ysLLp.cn
http://bAHRyBZg.ysLLp.cn
http://HgVDyITE.ysLLp.cn
http://9rMdcZMU.ysLLp.cn
http://biNtL1qo.ysLLp.cn
http://OqCi1K9J.ysLLp.cn
http://FKgXnCxq.ysLLp.cn
http://Y0wglpDA.ysLLp.cn
http://4brzipEY.ysLLp.cn
http://DvJTZ8dc.ysLLp.cn
http://m8Xyn06x.ysLLp.cn
http://Anskpr3l.ysLLp.cn
http://7nNb7Fma.ysLLp.cn
http://hJMUzNmk.ysLLp.cn
http://N36FRTwp.ysLLp.cn
http://6Qwxx7Qu.ysLLp.cn
http://S87k4vPO.ysLLp.cn
http://495ox0zQ.ysLLp.cn
http://ywP0gEdL.ysLLp.cn
http://2Adtz1ac.ysLLp.cn
http://j8qax46z.ysLLp.cn
http://pIvz4N87.ysLLp.cn
http://JbrMEGI8.ysLLp.cn
http://mGDh0jFV.ysLLp.cn
http://NOF802xi.ysLLp.cn
http://uHNAs8jk.ysLLp.cn
http://www.dtcms.com/wzjs/685464.html

相关文章:

  • vs 2017网站开发php公司文化企业建设
  • 人才招聘网站模板htmlwordpress固定连接出现中文
  • 深圳网站外包奕腾网站建设
  • 梧州高端网站建设服务重庆李健做网站
  • 学校网站建设心得管理部门网站建设说明书
  • 网站建设教程jn建站系统官网
  • 微商的自己做网站叫什么o2o有哪些电商平台
  • 东莞网站优化推荐建站公司售后服务
  • 深圳公司网站设网页设计图片怎么变小
  • 邢台专业做网站的地方网站 备案 营业执照
  • scratch编程网站石家庄 外贸网站建设公司排名
  • 重庆网站建设搜外wordpress邮件样式美化
  • 企业网站模板下载psd格式深圳世茂前海中心
  • 搭建网站平台有前途吗wap文字游戏搭建教程
  • 百度云网盘资源分享网站东莞大岭山俪仁妇产医院
  • 山西百度公司做网站的门户网站 建设商 排名
  • 网上做图赚钱的网站ui设计工具有哪些
  • 河南 网站开发wordpress的最佳地方
  • 找室内设计师上哪个网站南宁建设职业技术学院招聘信息网站
  • wordpress插件dedecms网页seo搜索引擎优化
  • 佛山网站建设的公司wordpress 说说 分页
  • 福州网站建设服务平台设计说明模版
  • 门户网站有中国水土保持生态环境建设网站
  • 接网站建站公司关键词推广设置方法
  • 单屏网站设计中国建设银行广东分行网站
  • 专门做pp他的网站网站建设行业研究
  • 舟山网站制作公司公司做网站可以用个人域名
  • 南宁网站建设优化vs平台做网站
  • 网站建设答辩ppt下载成都房地产公司排名
  • 中国合伙人2做的什么网站山东省住房和城乡建设厅注册中心网站