В одностраничном приложении элементы часто удаляются и заменяются. На элементах, удаленных из 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 и отключить его.
deleted
означает сборку мусора, а неdetached
, поэтому в вашем случае это не так. В любом случае, спецификация и сам API находятся на уровне PoC, поэтому вам может потребоваться уточнить этот аспект с авторами спецификации. - person wOxxOm   schedule 22.12.2017unobserved()
эти элементы перед их удалением, проблемы исчезли. - person bryanbraun   schedule 15.08.2019