
MutationObserver 是一种强大的 Web API,用于监听 DOM 树的变化。 然而,有时开发者会遇到 MutationObserver 没有按预期触发回调函数的情况。正如本文摘要所说,当使用 innerHTML 修改 DOM 时,需要特别注意监听配置。
MutationObserver 允许你注册一个回调函数,该函数会在 DOM 树发生特定类型的变化时被调用。 可以通过 MutationObserver.observe() 方法来指定要观察的 DOM 节点以及要观察的变化类型。 常见的观察选项包括:
当使用 innerHTML 属性修改 DOM 元素的内容时,实际上会替换该元素的所有子节点。 这意味着原有的节点会被删除,新的节点会被添加。 因此,如果只是监听 characterData,而使用 innerHTML 替换了整个子节点,那么 MutationObserver 不会触发回调。
例如,以下代码可能无法按预期工作:
<body>
<div id="msg">Hello</div>
<script>
var el = document.getElementById("msg");
var obs = new MutationObserver(() => {
console.log("Changed!");
});
obs.observe(el, {subtree: true, characterData: true});
setTimeout(() => {
el.innerHTML += " World!";
}, 3000);
</script>
</body>
</html>在这个例子中,我们试图监听 msg 元素及其子树的文本内容变化。 但是,el.innerHTML += " World!" 实际上是替换了 msg 元素的整个内容,而不是简单地修改了文本。 因此,characterData 的监听不会触发回调。
小爱开放平台
小米旗下小爱开放平台
291
查看详情
要正确监听 innerHTML 修改带来的 DOM 变化,需要将 childList 选项设置为 true。 这样,MutationObserver 就会在子节点被添加或删除时触发回调。
修改后的代码如下:
<body>
<div id="msg">Hello</div>
<script>
var el = document.getElementById("msg");
var obs = new MutationObserver(() => {
console.log("Changed!");
});
obs.observe(el, {childList: true});
setTimeout(() => {
el.innerHTML += " World!";
}, 3000);
</script>
</body>
</html>在这个修改后的版本中,我们监听了 msg 元素的 childList 变化。 当 el.innerHTML += " World!" 执行时,msg 元素的子节点会被替换,从而触发 MutationObserver 的回调函数。
Mutation
Observer 是一个强大的 DOM 监听工具,但需要正确配置才能正常工作。 当使用 innerHTML 修改 DOM 时,务必注意监听 childList 变化。 通过理解 MutationObserver 的工作原理和正确配置监听选项,可以有效地监听 DOM 变化,并构建更具响应性和交互性的 Web 应用。
以上就是MutationObserver 回调未触发?原因分析与解决方案的详细内容,更多请关注其它相关文章!
相关文章:
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
outlook中文官网入口地址 outlook官方中文版直达首页链接
Lar*el开发:如何在编辑界面正确预选数据库中的多选标签
微信网页版登录教程_微信网页版登录入口在哪
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
单射、满射与双射的关系 一文理清所有逻辑
2026春节假期时间安排 2026春节假日查询
msn官网入口地址手机版 msn官方网站手机最新链接
Go Martini框架:动态服务解码后的图片内容
J*aScript中安全有效地处理localStorage字符串数据
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
Go语言中构建可靠数据存储的原子性与持久化策略
照顾宝贝2小游戏免费秒玩入口
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
必由学官网快捷入口 必由学网页版在线学习平台
深入理解Go语言中的指针类型:以*string为例
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
Yii2模块参数配置指南:正确声明与访问模块级配置
12306选座如何查看座位示意图_12306座位示意图解读与使用
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
Promise错误处理:在catch后终止链式then执行的策略
解决移动端滚动问题的overflow属性应用指南
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
Linux如何构建多环境配置管理_Linux多环境配置方案
ArrayList与LinkedList核心操作的Big-O复杂度分析
如何在CSS中使用浮动制作导航栏_float实现水平菜单
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
Eclipse怎么运行工程_Eclipse工程运行配置说明
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
期待已久:小米17 Ultra、小米首款NAS本月登场
处理Kafka消息时会话超时与实现幂等性消费者
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
微信网页版官方入口直达 微信网页版网页版登录使用方法
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架