Приятно иметь прослушиватели событий для событий в элементах, но как вы отслеживаете что-то вроде изменения атрибута?
Введите MutationObserver
. Одно из его лучших качеств - это возможность наблюдать за данными, которые иначе невозможно «прослушать», как традиционное событие DOM.
Сначала настройте функцию, которая будет вызываться MutationObserver
. Требуется всего один аргумент: mutationsList
. Каждый элемент в списке называется MutationRecord
. Обратный вызов может делать все, что вы хотите.
const mutationCallback = (mutationsList) => { for (const mutation of mutationsList) { if ( mutation.type !== "attributes" || mutation.attributeName !== "data-foo" ) { return } console.log('old:', mutation.oldValue) console.log('new:', mutation.target.getAttribute("data-foo")) } }
Затем MutationObserver
принимает ваш обратный вызов при инициализации экземпляра:
const observer = new MutationObserver(mutationCallback)
Конечно, мы еще не отключили наблюдателя. просто вызовите метод observe
для своей новой переменной. Его аргументы - это элемент для наблюдения и объект, описывающий наблюдаемые вами данные:
observer.observe(myElement, { attributes: true })
Наконец, вы можете прекратить наблюдение за изменениями с помощью метода disconnect
:
observer.disconnect()
Вот и все. Легко, правда? Ну просто будь осторожен; может возникнуть соблазн создать новых наблюдателей за мутациями для каждой мелочи. Вместо этого постарайтесь объединить как можно больше в одном наблюдателе. Вы также можете добавить subtree: true
при вызове метода observe
, чтобы отслеживать изменения дочерних узлов!
Ознакомьтесь с полным набором опций для просмотра наблюдаемых данных здесь.
Если вам понравилось то, что вы читаете, не стесняйтесь стереть эту кнопку «Нравится». ✅
Джордж - интерфейсный разработчик и цифровой дизайнер, живущий в Орегоне. Днем он работает инженером-программистом в команде систем проектирования ServiceNow. Ночью он постоянно перестраивает свою коллекцию видеоигр, чтобы отвлечься от игры.