在单页应用程序中,元素经常被删除和替换。在从 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
.
通常我会假设垃圾收集会很好地完成它的工作,但是脚本会保留对所有附加元素的引用数组。并且该阵列不会被清理(并且没有观察者就无法清理)
- 编辑 -
它不会被“删除”(或至少不会在 10 秒内)https://jsfiddle.net/c1sgdcrd/所以,问题仍然存在,最好将它保存在内存中还是积极使用 MutationObserver 并断开它。