MutationObserver:MutationObserver() 构造函数
DOM 的MutationObserver()
构造函数 — 作为MutationObserver
接口的一部分 — 创建并返回一个新的观察器,当 DOM 事件发生时调用指定的回调函数。
DOM 观察不会立即开始;必须首先调用observe()
方法来确定要监视的 DOM 部分以及要监视的更改类型。
语法
js
new MutationObserver(callback)
参数
callback
-
一个函数,将在每个符合给定观察节点或子树和选项的 DOM 更改时被调用。
callback
函数接受两个参数作为输入- 一个
MutationRecord
对象的数组,描述发生的每个更改。 - 调用
callback
的MutationObserver
。这最常用于使用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 的浏览器中加载。