MutationObserver API 探究

158 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

MutationObserver 是现代浏览器提供的一个 Web API,用于检测 DOM 中的变化。使用此 API 可以监听新添加或删除的节点、属性更改或文本节点内容的更改。

为什么需要这么做呢?

在很多情况下,MutationObserver API 可以派上用场。例如:

  • 您想通知用户,他们当前所在的页面发生了一些变化。
  • 您正在开发一个新的花哨的 JavaScript 框架,该框架会根据 DOM 的变化动态加载 JavaScript 模块。
  • 您可能正在使用 WYSIWYG 编辑器,尝试实现撤消功能。通过利用 MutationObserver API,您可以随时了解所做的更改,因此您可以轻松撤消它们。

这些只是 MutationObserver 如何提供帮助的几个例子。

如何使用 MutationObserver

在你的应用中实现MutationObserver非常简单。您只需要给构造函数传递一个函数参数,即可创建一个 MutationObserver 实例,该函数在每次 DOM 发生改变时都会被调用。该函数的第一个参数是单个批次中发生的所有改变的集合。每个改变都提供有关其类型和已发生变化的信息。

var mutationObserver = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation);
  });
});

创建的实例有三个方法:

  • observe— 开始监听变化。接受两个参数——你想观察的 DOM 节点和一个设置对象
  • disconnect — 停止监听变化
  • takeRecords — 返回触发回调之前的最后一批更改。

以下代码段显示了如何开始观察:

// 开始监听该页面根节点的 DOM 变化
mutationObserver.observe(document.documentElement, {
  attributes: true,
  characterData: true,
  childList: true,
  subtree: true,
  attributeOldValue: true,
  characterDataOldValue: true
});

现在,假设 DOM 中有一些很简单的div

<div id="sample-div" class="test"> Simple div </div>

使用 jQuery,您可以从该 div 中删除 class 属性:

$("#sample-div").removeAttr("class");

我们前面已经开始观察了,因此调用mutationObserver.observe(...)后,我们将在相应MutationRecord 的控制台中看到一个日志:

这是移除class属性引起的改变。

最后,要停止观察 DOM,您可以执行以下操作:

mutationObserver.disconnect();

现在,得到了MutationObserver广泛的支持:

image.png