删除元素时是否应断开IntersectionObserver的连接

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?