删除元素时是否应断开IntersectionObserver

时间:2017-12-22 14:02:43

标签: 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
  });
}

底部(mutationOberserver)是否无用?由于对document.body进行了大量检查,它甚至可能会损害性能。

通常我只是假设垃圾收集会很好地完成它的工作,但脚本会保留一个对所有Attached元素的引用数组。并且该阵列不会被清理(并且不能在没有观察者的情况下进行清洁)

- 编辑 -

它没有被删除&#34; (或者至少不会在10秒内)https://jsfiddle.net/c1sgdcrd/因此,问题仍然存在,只需将其保留在内存中或主动使用MutationObserver并断开连接即可。

1 个答案:

答案 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?