MutationObserver是什么?

简介: MutationObserver是什么?

image.png


目录


  • MutationObserver概览
  • MutationObserver构造器
  • MutationObserver实战


MutationObserver概览


  • MutationObserver interface可以用来监测DOM树的变化。
  • MutationObserver 是旧的DOM3事件规范Mutation Events特性的一个替换。
  • 在DOM事件触发的时候,会触发MutationObserver中传入的callback。
  • DOM监听是不会立刻开始的,必须调用observer()方法才能监听。


MutationObserver构造器


var observer = new MutationObserver(callback);

callback接受MutationRecord和MutationObserver两个入参。MutationRecord描述的是变化;MutationObserver触发callback。


示例


  • 下面的例子创建了一个MutationObserver
  • 这个observer watch了一个node和它的所有children element的新增和移除,以及element上的attribute的变化。


callback function
function callback(mutationList, observer) {
    mutationList.forEach((mutation) => {
        switch (mutation.type) {
            case 'childList':
                // 关注mutation.addedNodes和mutation.removedNodes属性
                break;
            case 'attributes':
                // 关注mutation.target, mutation.attributeName, mutation.oldValue
               break;
        }
    })
}


callback() 函数会在observer用observe()开始监视DOM时,指定的观察请求配置相匹配的更改时,将调用callback()函数。

所发生的更改(对子列表的更改或对属性的更改)通过查看mutation.type属性。


创建并且启动observer


下面的代码设置了整个观察进度。


var targetNode = document.querySelector("#someElement");
var observerOptions = {
    childList: true,
    attributes: true,
    subtree: true, // 忽略或设置为false,只观察父节点的更改
}
var observer = new MutationObserver(callback);
observer.observe(targetNode, observerOptions);


  • targetNode上每次元素从DOM树上添加或者删除,callback都会调用;属性值发生变化,callback也会调用。
  • 直到disconnect()方法调用,targetNode才会从DOM树上移除。


MutationObserver实战


自定义高德地图panel样式(与深度选择器效果相同的js方案)


<style lang="scss">
// 隐藏跳转高德地图的按钮
/deep/ .amap-call {
  display: none;
}
</style>


为什么要动态监听panel子节点?
  • 全局css会影响污染全局环境,其他地方的高德地图panel会被影响
  • scoped单文件组件中可以使用深度选择器修改样式,/deep/ .amap-all 或者 .map-container >>> .amap-all

不使用深度选择器的话,还有没有其他的方式去修改?


监听panel动态插入 .amap-all DOM或许可以试试


实现步骤
  • 创建MutationObserver,监听高德地图panel DOM树变化
  • 创建callback,捕捉.amap-call class元素隐藏跳转高德地图的按钮
  • 组件销毁前disconnect()取消监听


代码实现
<div id="panel"></div>
 // 动态检测panel的amap-call节点
observePanelAmapCallNode() {
  const callback = (mutationList, observer) => {
    mutationList.forEach((mutation) => {
      switch (mutation.type) {
        case 'childList':
          // 关注mutation.addedNodes和mutation.removedNodes属性
          console.log(mutation, observer);
          if (mutation.addedNodes[0].className === 'amap-call') {
            mutation.addedNodes[0].style.display = 'none';
          }
          break;
        default: {
          console.log(mutation, observer);
        }
      }
    });
  };
  const targetNode = document.querySelector('#panel');
  const observerOptions = {
    childList: true,
    subtree: true,
  };
  this.panelAmapCallNodeObserver = new MutationObserver(callback);
  this.panelAmapCallNodeObserver.observe(targetNode, observerOptions);
},
// 取消监听observer
disconnectObserver() {
  this.panelAmapCallNodeObserver.disconnect();
},


mounted() {
    this.observePanelAmapCallNode();
}
beforeDestroy() {
    this.disconnectObserver();
}

默认样式(修改前)


image.png


自定义样式(修改后)


image.png


MutationObserver成功!


参考资料:https://developer.mozilla.org...





相关文章
|
Dubbo 关系型数据库 MySQL
nacos常见问题之命名空间配置数据上线修改如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
890 1
|
存储 SQL Java
Java8 stream 中利用 groupingBy 进行多字段分组求和
Java8 stream 中利用 groupingBy 进行多字段分组求和
|
前端开发 JavaScript 开发者
useEffect 钩子详解与实战
【10月更文挑战第3天】React 作为一个流行的 JavaScript 库,通过 Hooks 大幅简化了组件开发。`useEffect` 是一个核心 Hook,用于处理函数组件中的副作用操作,如数据获取和 DOM 更改。本文详细介绍了 `useEffect` 的基本语法、常见用法及示例,包括模拟 `componentDidMount`、`componentDidUpdate` 和 `componentWillUnmount`。此外,还探讨了如何避免无限循环渲染和内存泄漏等问题,并提供了相应的解决方案,帮助开发者更好地理解和应用 `useEffect`,提升应用程序的性能与稳定性。
246 7
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
Linux 语音技术 Python
如何解决kaldi的依赖库mkl安装失败的问题
通过搜索大量的资料,但都发现不太适用。现在将失败的症状和解决方法分享一下,希望能给读者提供一些帮助。
如何解决kaldi的依赖库mkl安装失败的问题
|
资源调度 JavaScript PHP
Vue3+ element plus 前后分离admin项目安装教程
Vue3+ element plus 前后分离admin项目安装教程
364 0
|
存储 缓存 前端开发
使用React hooks,些许又多了不少摸鱼时间
该文章详细讲解了React Hooks的各种用法,包括useState、useEffect、useContext等基础Hooks,以及自定义Hooks的创建,并通过实际示例展示了如何利用Hooks简化组件状态管理和副作用操作,从而提高开发效率。
|
JavaScript
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
324 0
|
机器人 API 开发工具
阿里云百炼应用实践系列-基于LlamaIndex的文档问答助手
本文以阿里云百炼官方文档问答助手为例,介绍如何基于阿里云百炼平台打造基于LlamaIndex的RAG文档问答产品。我们基于阿里云百炼平台的底座能力,以官方帮助文档为指定知识库,搭建了问答服务,支持钉钉、Web访问。介绍了相关技术方案和主要代码,供开发者参考。
1589 22
|
存储 前端开发 中间件
DDD建模系列(二)
DDD建模系列(二)