JavaScript MutationObserver — стеження за змінами DOM
MutationObserver повідомляє про зміни в DOM: додані чи видалені вузли, змінені атрибути, змінений текст.
Загальний опис
Потрібен там, де зміни робить не твій код: сторонній віджет, чужий скрипт, редагований вміст. Свої зміни ти й так бачиш — а от коли розмітку переписує хтось інший, дізнатись про це можна лише так.
Спостерігач збирає зміни пачками і віддає їх одним викликом — на відміну від старих mutation-подій, які били на кожну дрібницю й через це були настільки повільними, що їх викинули зі стандарту.
У налаштуваннях кажеш, що саме стежити: childList (діти), attributes (атрибути), characterData (текст), і чи заглядати вглиб — subtree.
- Нотатка
-
Легко вистрелити собі в ногу: якщо всередині обробника змінювати той самий DOM, спостерігач покличе себе знову — і вийде нескінченний цикл. На час своїх змін його вимикають (
автор: NagarDdisconnect()).
Синтаксис
const observer = new MutationObserver(callback);\nobserver.observe(node, config);
методи
| Метод | Опис |
|---|---|
| observe | Починає стежити за вузлом із заданою конфігурацією. |
| disconnect | Припиняє стеження. |
| takeRecords | Забирає ще не оброблені записи змін. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| MutationObserver | 26+ | 14+ | 7+ | 15+ | 12+ | 11+ |
| Переглядач | ||||
|---|---|---|---|---|
| MutationObserver | 4.4+ | yes | yes | 7+ |
Приклади
+ запропонувати свій приклад у пісочниці
Стежимо за чужим кодом, що переписує список.
HTML
<ul id="list"></ul>
JS
const list = document.getElementById('list');
const observer = new MutationObserver(mutations => {
for (const mutation of mutations) {
if (mutation.type === 'childList') {
console.log('Додано:', mutation.addedNodes.length);
console.log('Видалено:', mutation.removedNodes.length);
}
if (mutation.type === 'attributes') {
console.log('Змінено атрибут', mutation.attributeName);
}
}
});
observer.observe(list, {
childList: true,
attributes: true,
subtree: true, // разом із нащадками
});
// хтось (не ми) додає елемент — ми про це дізнаємось
list.append(document.createElement('li'));
// коли більше не треба
// observer.disconnect();
Коментарі
Коментарів ще немає — будьте першим!