Если IntersectionObserver будет отключен при удалении элемента

В одностраничном приложении элементы часто удаляются и заменяются. На элементах, удаленных из 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 и отключить его.


person René    schedule 22.12.2017    source источник
comment
w3c.github.io/IntersectionObserver/#lifetime   -  person wOxxOm    schedule 22.12.2017
comment
@wOxxOm Я не был уверен в удалении из-за ссылки, которую храню. Он только удаляется из документа, но не удаляется окончательно. но я полагаю, что это то же самое для IntersectionObserver?   -  person René    schedule 22.12.2017
comment
Я думаю, deleted означает сборку мусора, а не detached, поэтому в вашем случае это не так. В любом случае, спецификация и сам API находятся на уровне PoC, поэтому вам может потребоваться уточнить этот аспект с авторами спецификации.   -  person wOxxOm    schedule 22.12.2017
comment
Можно ли изменить сценарий для использования WeakMap элементов вместо массива? Затем элементы можно было бы собрать сборщиком мусора, и IntersectionObserver перестал бы наблюдать за ними по мере их сбора.   -  person FellowMD    schedule 19.03.2018
comment
У меня появлялись странные ошибки, когда я удалял наблюдаемые элементы и добавлял на их место новые. Мой обратный вызов сработает, и я увижу старые цели в моем списке записей, но у них не было информации о parentNode или позиции. Как только я unobserved() эти элементы перед их удалением, проблемы исчезли.   -  person bryanbraun    schedule 15.08.2019


Ответы (1)


Я пока не могу найти официальную публикацию, но предполагаю, что это то же самое, что и MutationObservers, то есть сборка мусора должна обрабатывать удаление после удаления элемента DOM. См. https://dom.spec.whatwg.org/#garbage-collection.

Я также разместил здесь ответ для МО: Следует ли удалять / отключать MutationObservers при удалении присоединенного узла DOM, например removeEventListener для событий?

person bit-less    schedule 29.06.2018