Отслеживание изменений в DOM через Mutation Events и MutationObserver
Отслеживание изменений в DOM через Mutation Events и MutationObserver
Время статичных web-страниц уже давно прошло, теперь немалая часть контента подгружается динамически уже после загрузки основной страницы. Соответственно, эти данные недоступны для скриптов, отслеживающих загрузку через события типа onload или DOMContentLoaded. Может возникнуть вопрос: а зачем вообще это отслеживать? Ну, например, чтобы при помощи браузерных расширений и пользовательских скриптов удалять со страниц динамически подгружаемую рекламу, которую другими способами не заблокировать. К счастью, для отслеживания любых изменений, вносимых в структуру DOM, есть как минимум два инструмента. Речь идет о событиях Mutation Events и интерфейсе MutationObserver.
Начнем с Mutation Events. Это была первая технология, представленная разработчиками браузеров, позволяющая web-мастерам отслеживать изменения в DOM и каким-то образом реагировать на них. Это набор событий, срабатывающих при добавлении или удалении элемента, изменении атрибутов, содержимого и т.п. Использовать их можно как и любые другие события. Приложению достаточно выбрать отслеживаемый элемент и повесить на него обработчик соответствующего события или событий, в зависимости от поставленной задачи.
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Элемент, в котором отслеживаются изменения
- var el=document.getElementById('test');
- // Добавить обработку события
- el.addEventListener("DOMNodeInserted",
- function(e) {
- // Добавляемый элемент
- var node=e.srcElement;
- // Родительский элемент
- var target=e.relatedNode;
- ...
- },
- false
- );
- </script>
При кажущейся простоте использования, события Mutation Events остаются событиями, поэтому вызываются синхронно. В связи с этим они имеют большие проблемы с производительностью, особенно в случае, когда меняется много элементов. Более того, если обработчик попытается самостоятельно добавить какой-нибудь элемент к целевому, то это также повлечет за собой срабатывания этого же обработчика, что в конечном итоге может привести к непредсказуемым результатам. Поэтому буквально через год после релиза технология Mutation Events получила статус "устаревшей", да и поддержка этих событий браузерами оставляет желать лучшего.
Следующим шагом развития технологии отслеживания изменений на странице стало появление браузерного API DOM MutationObserver, который должен был избавиться от недостатков Mutation Events. Пользоваться DOM MutationObserver не намного сложнее, чем событиями. Выбираем элемент, в котором будут отслеживаться изменения, создаем объект наблюдателя и задаем конфигурацию, в которой прописываем, какие изменения нас интересуют. Это может быть изменение атрибутов, содержимого, добавление или удаление элементов.
Code (JavaScript) : Убрать нумерацию
- // Элемент, в котором отслеживаются изменения
- var el=document.getElementById('test');
- // Создать наблюдателя
- var observer = new MutationObserver(function(mutations) {
- for (var i in mutations) {
- // Запись о произошедших изменениях
- var mutation=mutations[i];
- ...
- };
- });
- // Запустить наблюдателя изменений
- observer.observe(el, {
- attributes: true,
- childList: true,
- subtree: true,
- characterData: true
- });
- type - тип изменения, одно из возможных значений: "attributes" - изменен атрибут, "characterData" - изменены данные текстовых узлов, "childList" - добавлены или удалены дочерние элементы;
- target - где произошло изменение: элемент для "attributes", текстовый узел для "characterData" или элемент для "childList";
- addedNodes/removedNodes – список добавленных и удаленных элементов;
- oldValue - предыдущее значение при изменении атрибута или текста.
Когда наблюдатель больше не нужен, его можно отключить методом disconnect(). Но даже после отключения наблюдателя, последние необработанные записи будут доступны через метод takeRecords().
Просмотров: 3735 | Комментариев: 2
Метки: JavaScript
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(01.09.2020 в 12:48):
Художник Вася Ложкин, фрагмент одной из его картин.
Petya
(01.09.2020 в 12:42):
Что-то мне эти строгие дядьки в штатском напоминают. Откуда взяли?
Добавить комментарий
Заполните форму для добавления комментария