Ren*_*ené 5 javascript performance dom mutation-observers intersection-observer
在单页应用程序中,通常会删除和替换元素。在从DOM中删除的元素上,可能有一个IntersectionObserver(或任何其他种类)
对于事件,我从不打扰,因为它们是绑定在目标上并触发的,因此保留它们应该相当无害。对于IntersectionObserver,我有点担心在任何视图更改时都会检查所有实例。
考虑一下我的Lazy.ts的以下部分
setIntersectionObserver(config:LazyConfig)
{
let intersectionObserver = new IntersectionObserver((entries:Array<IntersectionObserverEntry>) => {
for (let entry of entries) {
if (entry.isIntersecting) {
this.lazyLoad(config);
intersectionObserver.disconnect();
mutationOberserver.disconnect();
}
}
}, {
threshold: 0,
rootMargin: `${config.offset}px`,
});
intersectionObserver.observe(config.element);
let mutationOberserver = new MutationObserver((entries:Array<MutationRecord>) => {
if (
entries[0].removedNodes &&
document.body.contains(config.element) === false
) {
intersectionObserver.disconnect();
mutationOberserver.disconnect();
}
});
mutationOberserver.observe(document.body, {
childList: true,
subtree: true
});
}
Run Code Online (Sandbox Code Playgroud)
底部(mutationOberserver)是否无效?由于进行了许多检查,甚至可能损害性能document.body。
通常,我只是假定垃圾收集会很好地完成其工作,但是脚本保留了对所有Attached元素的引用数组。而且该数组不会被清除(没有观察者也无法清除)
- 编辑 -
它没有得到“删除”(或至少不会在10秒内)https://jsfiddle.net/c1sgdcrd/所以,问题仍然有效羯羊,最好只保留在内存中或积极利用MutationObserver和断开。
bit*_*ess 10
我还找不到官方帖子,但我假设它与 MutationObservers 相同,即垃圾收集应该在 DOM 元素被删除后处理删除。请参阅https://dom.spec.whatwg.org/#garbage-collection
我还在这里发布了 MO 的答案:当附加的 DOM 节点像事件的 removeEventListener 一样被删除时,是否应该删除/断开连接 MutationObservers?