【发布时间】:2020-03-23 18:15:51
【问题描述】:
我正在尝试使用 MutationObserver 来监视应用程序库中已删除的节点,但似乎在删除(或替换)父节点时,它不会触发所有子元素的回调。
<button class="RemoveListButton">Remove List</button>
<div class="Container">
<ul class="ShoppingList">
<li class="Item">Pasta</li>
<li class="Item">Chips</li>
<li class="Item">Salsa</li>
</ul>
</div>
const removeWatcher = new MutationObserver(mutationList => {
const removedNodes = mutationList.flatMap(m => [...m.removedNodes])
console.log('Removing', removedNodes)
})
const container = document.querySelector('.Container')
removeWatcher.observe(container, { subtree: true, childList: true })
/* additional javascript to remove elements on click */
见 JSFiddle https://jsfiddle.net/eq4ahsvc/3/
在示例中,当我删除单个列表项(通过单击它)时,我在控制台中看到该元素已被 Mutation Observer 删除并看到。
但是,当我删除整个列表时,只会为父元素触发 Mutation Observer 回调,而不是为单个子元素触发。
有没有办法配置这种行为?理想情况下,每个元素都会触发 MutationObserver 回调,这样在删除列表时,我会看到删除列表的触发器,以及删除每个子元素的触发器。
【问题讨论】:
-
如果一个有 1000 个子元素的元素像 el.remove() 一样被删除,它的 1000 个子元素不会被 MutationObserver 报告,这是性能的预期行为。你可以自己枚举元素。
标签: javascript dom mutation-observers