14

在单页应用程序中,元素经常被删除和替换。在从 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 并断开它。

4

1 回答 1

3

我还找不到官方帖子,但我假设它与 MutationObservers 相同,即垃圾收集应该在移除 DOM 元素后处理移除。见https://dom.spec.whatwg.org/#garbage-collection

我还在这里发布了 MO 的答案:当附加的 DOM 节点被移除时,MutationObservers 是否应该被移除/断开连接,比如事件的 removeEventListener?

于 2018-06-29T16:52:33.880 回答