网站首页 > 技术文章 正文
JavaScript 中的 MutationObserver 是一种用于监视 DOM 变化的接口,能够在指定的 DOM 元素或其子元素发生特定类型的变化时触发回调。它是现代浏览器提供的 API,用于替代旧的 Mutation Events(性能较差且已被废弃)。
基本用法
- 创建观察者实例:通过构造函数 new MutationObserver(callback) 创建实例,callback 是 DOM 变化时触发的函数。
- 配置观察选项:定义需要观察的变化类型(如子节点、属性、文本等)。
- 绑定目标节点:调用 observe(targetNode, config) 开始观察指定节点。
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
console.log('子节点发生变化!');
}
}
});
// 配置观察选项
const config = {
childList: true, // 观察子节点变化
subtree: true, // 观察所有后代节点
attributes: true, // 观察属性变化
attributeFilter: ['class'] // 仅观察 class 属性
};
// 开始观察目标节点
observer.observe(document.getElementById('target'), config);
// 停止观察
observer.disconnect();
应用场景
- 动态内容加载
在单页应用(SPA)或异步加载内容时,检测 DOM 变化后执行操作(如初始化组件、绑定事件)。
// 动态加载评论后,自动初始化新评论的交互功能
observer.observe(document.querySelector('#comments-container'), {
childList: true,
subtree: true
});
表单实时验证
监听输入框内容或属性的变化(如 value、disabled)进行即时验证。
observer.observe(document.querySelector('#email-input'), {
attributes: true,
attributeFilter: ['value']
});
响应式设计增强
在 CSS 无法实现的场景下,通过 DOM 变化触发布局调整(如容器尺寸变化)。
深度使用技巧
- 性能优化
- 减少回调处理时间:避免在回调中执行复杂操作,可用 requestIdleCallback 拆分任务。
- 精准配置选项:仅观察必要的变动类型(如不观察 subtree 时关闭它)。
- 按需观察/停止:及时调用 disconnect() 避免内存泄漏。
- 批量处理变动
MutationObserver 的回调是异步的,会将多次 DOM 变动合并到一次回调中。可通过遍历 mutationsList 批量处理:
(mutationsList) => {
mutationsList.forEach(mutation => {
if (mutation.type === 'childList') {
// 处理新增或删除的节点
}
});
}
观察 Shadow DOM
支持监控 Web Components 内部的 Shadow DOM 变化:
const shadowRoot = document.getElementById('host').shadowRoot;
observer.observe(shadowRoot, { childList: true });
属性变化过滤
使用 attributeFilter 精确观察特定属性,减少不必要触发:
observer.observe(target, {
attributes: true,
attributeFilter: ['data-status', 'aria-expanded'] // 仅观察这两个属性
});
- 与框架结合
在 Vue/React 中,若需绕过框架的虚拟 DOM 直接操作 DOM 时,可通过 MutationObserver 追踪变化。
注意事项
- 兼容性:支持所有现代浏览器(IE11+),旧版浏览器需要 Polyfill(如 mutationobserver-shim)。
- 异步触发:回调在微任务队列执行,可能晚于某些同步代码。
- 避免循环触发:在回调中修改 DOM 可能导致无限循环(需添加终止条件)。
- 上一篇: 前端面试-关于VDOM的分析与高频面试题
- 下一篇: 最新Spark面试题精选
猜你喜欢
- 2025-04-27 2024前端面试题vue篇 Vue Router 如何配置 404 页面(2)
- 2025-04-27 2024大厂前端面试题vue篇 Vue 有哪些内置指令 ?
- 2025-04-27 最新Spark面试题精选
- 2025-04-27 前端面试-关于VDOM的分析与高频面试题
- 2025-04-27 中电科技Web前端面试题
- 2025-04-27 一套比较完整的字节面试题,包含计算机网络、操作系统、前端等
- 2025-04-27 前端面试-关于Promise解析与高频面试题示范
- 2025-04-27 前端面试-关于Proxy解析与高频面试题示范
- 2025-04-27 前端面试题-Vue 项目中,你做过哪些性能优化?
- 2025-04-27 前端面试题-检测对象循环引用
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 567℃几个Oracle空值处理函数 oracle处理null值的函数
- 566℃Oracle分析函数之Lag和Lead()使用
- 550℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 545℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 543℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 536℃【数据统计分析】详解Oracle分组函数之CUBE
- 526℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 519℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)