MutationObserver是什么?

更新日期: 2019-12-24阅读: 2.3k标签: 用法

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();
}

原文:https://segmentfault.com/a/1190000021404402

链接: https://fly63.com/article/detial/7036

8种你可能正在写错的SQL用法

分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升

在vue里使用codemirror的两种用法

这是我自己做的一个左边点击对应的标题,右边显示相应代码的一个功能。代码显示这里用的是vue-codemirror插件。data中cmOptions的配置,这里我写的比较简单,具体的配置项,可以去查官方文档

你可能不知道的JSON.stringify用法

JS 中有许多常见的函数,我们可能每天都在使用它们,但是却不知道它们的一些额外功能。JSON.stringify 就是这样的一个函数,今天就来看下它的特殊用法。

vue中ref的用法

ref 加在普通的元素上,用 this.$refs.name 获取到的是dom元素;ref 加在子组件上,用 this.$refs.name 获取到的是子组件实例,父组件可以使用子组件的所有方法(在上篇博客已介绍);如何利用 v-for 和 ref 获取一组数组或者dom 节点

vue中provide和inject 用法

provide和inject是成对出现的,用于父组件向子孙组件传递数据,provide在父组件中返回要传给下级的数据,inject在需要使用这个数据的子辈组件或者孙辈等下级组件中注入数据。

MutationObserver用法

Mutation Observer API 用来监视 DOM 变动。比如节点的增减、属性的变动、文本内容的变动。MutationObserver使用observe方法进行监听指定的元素节点变化

JavaScript中document.write()用法

在JavaScript中document.write()函数可以向文档写入HTML表达式或JavaScript代码,用法“document.write(exp1,exp2,exp3,....)”,该函数可接受任何多个参数,并将其写入文档中。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!