MutationObserver:MutationObserver() 构造函数

DOM 的MutationObserver()构造函数 — 作为MutationObserver接口的一部分 — 创建并返回一个新的观察器,当 DOM 事件发生时调用指定的回调函数。

DOM 观察不会立即开始;必须首先调用observe()方法来确定要监视的 DOM 部分以及要监视的更改类型。

语法

js
new MutationObserver(callback)

参数

callback

一个函数,将在每个符合给定观察节点或子树和选项的 DOM 更改时被调用。

callback 函数接受两个参数作为输入

  1. 一个MutationRecord对象的数组,描述发生的每个更改。
  2. 调用callbackMutationObserver。这最常用于使用MutationObserver.disconnect()断开观察器。

有关更多详细信息,请参阅下面的示例

返回值

一个新的MutationObserver对象,配置为在 DOM 发生变异时调用指定的callback

示例

观察子元素

此示例包含按钮,用于将<li>元素添加到列表中,以及从列表中删除第一个<li>元素。

我们使用MutationObserver来获取有关列表更改的通知。在回调函数中,我们记录添加和删除操作,并且一旦列表为空,我们就断开观察器。

"重置示例"按钮将示例重置为其原始状态。

HTML

html
<button id="add">Add child</button>
<button id="remove">Remove child</button>
<button id="reset">Reset example</button>

<ul id="container"></ul>

<pre id="log"></pre>

CSS

css
#container,
#log {
  height: 150px;
  overflow: scroll;
}

#container li {
  background-color: paleturquoise;
  margin: 0.5rem;
}

JavaScript

js
const add = document.querySelector("#add");
const remove = document.querySelector("#remove");
const reset = document.querySelector("#reset");
const container = document.querySelector("#container");
const log = document.querySelector("#log");

let namePrefix = 0;

add.addEventListener("click", () => {
  const newItem = document.createElement("li");
  newItem.textContent = `item ${namePrefix}`;
  container.appendChild(newItem);
  namePrefix++;
});

remove.addEventListener("click", () => {
  const itemToRemove = document.querySelector("li");
  if (itemToRemove) {
    itemToRemove.parentNode.removeChild(itemToRemove);
  }
});

reset.addEventListener("click", () => {
  document.location.reload();
});

function logChanges(records, observer) {
  for (const record of records) {
    for (const addedNode of record.addedNodes) {
      log.textContent = `Added: ${addedNode.textContent}\n${log.textContent}`;
    }
    for (const removedNode of record.removedNodes) {
      log.textContent = `Removed: ${removedNode.textContent}\n${log.textContent}`;
    }
    if (record.target.childNodes.length === 0) {
      log.textContent = `Disconnected\n${log.textContent}`;
      observer.disconnect();
    }
    console.log(record.target.childNodes.length);
  }
}

const observerOptions = {
  childList: true,
  subtree: true,
};

const observer = new MutationObserver(logChanges);
observer.observe(container, observerOptions);

结果

尝试点击“添加子元素”以添加列表项,并点击“删除子元素”以删除它们。观察器回调函数记录添加和删除操作。一旦列表为空,观察器就会记录“已断开连接”消息并断开观察器。

"重置示例"按钮重新加载示例,以便您可以再次尝试。

规范

规范
DOM 标准
# ref-for-dom-mutationobserver-mutationobserver①

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。