JavaScript MutationObserver — стеження за змінами DOM


MutationObserver повідомляє про зміни в DOM: додані чи видалені вузли, змінені атрибути, змінений текст.

автор: NagarD

Загальний опис

Потрібен там, де зміни робить не твій код: сторонній віджет, чужий скрипт, редагований вміст. Свої зміни ти й так бачиш — а от коли розмітку переписує хтось інший, дізнатись про це можна лише так.

Спостерігач збирає зміни пачками і віддає їх одним викликом — на відміну від старих mutation-подій, які били на кожну дрібницю й через це були настільки повільними, що їх викинули зі стандарту.

У налаштуваннях кажеш, що саме стежити: childList (діти), attributes (атрибути), characterData (текст), і чи заглядати вглиб — subtree.

автор: NagarD

Нотатка

Легко вистрелити собі в ногу: якщо всередині обробника змінювати той самий DOM, спостерігач покличе себе знову — і вийде нескінченний цикл. На час своїх змін його вимикають (disconnect()).

автор: NagarD

Синтаксис

const observer = new MutationObserver(callback);\nobserver.observe(node, config);

методи

Метод Опис
observe Починає стежити за вузлом із заданою конфігурацією.
disconnect Припиняє стеження.
takeRecords Забирає ще не оброблені записи змін.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
MutationObserver 26+ 14+ 7+ 15+ 12+ 11+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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();
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід