fomenkogregory
@fomenkogregory
Юниор софтварный инженер

Как удалить Mutation Observer?

const shittyFunction = (HTMLElement) => {
  const observer = new MutationObserver(() => {})
  observer.observe( HTMLElement, { attributes: true })
}
btn.addEventListener('click', () => {
  shittyFunction(*любой дом элемент*)
})

Каждый раз по клику на кнопку создаётся новый обсервер и добавляется к элементу, а мне надо чтобы старый обсервер заменялся новым. Разумеется каждый раз создаётся новый инстанс. Выносить обсервер из shittyFunction нельзя. каждый последующий вызов shittyFucnction добавляет обсервер к одному и тому же элементу. Теперь вопрос: как можно удалить обсервер, имея ссылку на него?
п.с. пока сделал так (ужасно, знаю), но обсерверы всё равно занимают память.

const observers = []
const shittyFunction = (HTMLElement) => {
  observers.forEach(obs => obs.disconnect())
  observers = []
  const observer = new MutationObserver(() => {})
  observer.observe( HTMLElement, { attributes: true })
  observers.push(observer)
}
btn.addEventListener('click', () => {
  shittyFunction(*любой дом элемент*)
})
  • Вопрос задан
  • 630 просмотров
Решения вопроса 1
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Во-первых, у вас присвоение к const

Во-вторых, я бы сделал как-то так:
let observer
function shittyFunction (HTMLElement) {
  if (observer) {
    observer.disconnect()
  }
  
  // Перезаписать старый новым, хоть и не понятно зачем
  observer = new MutationObserver(() => {})
  observer.observe( HTMLElement, { attributes: true })
}


Я не знаю, всей ситуации, но как по мне, тут какие-то архитектурные проблемы

Если по каким-то непонятным причинам вам запрещено выносить observer за пределы shittyFunction, можно использовать WeakMap
const map = new WeakMap()
function shittyFunction (HTMLElement) {
  let observer = map.get(HTMLElement)
  if (observer) {
    observer.disconnect()
  }
  
  // Перезаписать старый новым, хоть и не понятно зачем
  observer = new MutationObserver(() => {})
  observer.observe( HTMLElement, { attributes: true })
  map.set(HTMLElement, observer)
}


А ещё у вас может быть утечка памяти из-за замыкания в callback MutationObserver. Перепроверьте
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dasslier
FrontEnd Developer
Из статьи на learn.javascript "observer.disconnect() – останавливает наблюдение"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы