【发布时间】:2015-10-18 00:30:00
【问题描述】:
我有兴趣使用MutationObserver 来检测是否在 HTML 页面的任何位置添加了某个 HTML 元素。例如,我会说我想检测是否在 DOM 中的任何位置添加了任何 <li>。
到目前为止,我看到的所有MutationObserver 示例仅检测是否将节点添加到特定容器中。例如:
一些 HTML
<body>
...
<ul id='my-list'></ul>
...
</body>
MutationObserver定义
var container = document.querySelector('ul#my-list');
var observer = new MutationObserver(function(mutations){
// Do something here
});
observer.observe(container, {
childList: true,
attributes: true,
characterData: true,
subtree: true,
attributeOldValue: true,
characterDataOldValue: true
});
所以在本例中,MutationObserver 设置为监视一个非常确定的容器 (ul#my-list),以查看是否有任何 <li> 附加到它。
如果我想不那么具体,并且像这样在整个 HTML 正文中注意<li>,这会不会有问题:
var container = document.querySelector('body');
我知道它适用于我为自己设置的基本示例...但是不建议这样做吗?这会导致性能不佳吗?如果是这样,我将如何检测和衡量该性能问题?
我想也许有一个原因,所有 MutationObserver 示例都针对其目标容器如此具体...但我不确定。
【问题讨论】:
-
性能问题特定于给定场景。如果您的整个文档只有几个简单的元素,我敢肯定您不会有任何问题。如果您担心遇到性能问题,请配置文件!
-
我使用了大量的
MutationObservers 并让它们递归地查看整个 DOM。我个人从来没有遇到过性能问题。 -
引入 MutationObservers 和弃用 MutationEvents 的主要原因是 MutationObservers 更快,因为它们将更改聚合在一起。我们还在大型文档上使用带有
subtree: true的 MutationObservers,这从来都不是问题。 -
为什么要观察属性和字符数据的变化?你自己这么说——你想观察
li元素的可能添加吗?如果某事是次优性能的候选者,我会说要求比你需要的更多的事件,就是这样。 -
例如,Web 性能监控库 Boomerang.js (github.com/akamai/boomerang) 在整个文档上使用
MutationObserver来测量 SPA 页面加载时间。
标签: javascript html mutation-observers