在单页应用程序中,通常会删除和替换元素。在从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
});
}
底部(mutationOberserver
)是否无用?由于对document.body
进行了大量检查,它甚至可能会损害性能。
通常我只是假设垃圾收集会很好地完成它的工作,但脚本会保留一个对所有Attached元素的引用数组。并且该阵列不会被清理(并且不能在没有观察者的情况下进行清洁)
- 编辑 -
它没有被删除&#34; (或者至少不会在10秒内)https://jsfiddle.net/c1sgdcrd/因此,问题仍然存在,只需将其保留在内存中或主动使用MutationObserver并断开连接即可。
答案 0 :(得分:0)
我还没有找到一个官方的帖子,但是我将假定它与MutationObservers相同,即一旦DOM元素被删除,垃圾收集就应该处理删除。参见https://dom.spec.whatwg.org/#garbage-collection
我还在这里发布了MO的答案:Should MutationObservers be removed/disconnected when the attached DOM node is removed like removeEventListener for events?