--- title: MutationObserver slug: Web/API/MutationObserver tags: - API - Advanced - DOM - DOM Reference - NeedsContent - NeedsUpdate - Reference translation_of: Web/API/MutationObserver --- <p>{{APIRef("DOM")}}</p> <p><code>MutationObserver</code> предоставляет возможность получать уведомления об изменении определённых <a href="/en-US/docs/DOM">DOM</a>-элементов. <code>MutationObserver</code> является заменой <a href="/en-US/docs/DOM/Mutation_events">Mutation Events</a>, определённой в спецификации DOM3 Events.</p> <h2 id="Конструктор">Конструктор</h2> <dl> <dt>{{domxref("MutationObserver.MutationObserver", "MutationObserver()")}}</dt> <dd>Создаёт и возвращает новый <code>MutationObserver</code>, который вызовет определённую колбэк-функцию при изменении в DOM.</dd> </dl> <h2 id="Параметры">Параметры</h2> <dl> <dt><code>callback</code></dt> <dd>Вызывается при каждом изменении DOM-элемента. Наблюдатель вызывает данную функцию с двумя аргументами. Первым аргументом является массив объектов <a href="/en-US/docs/Web/API/MutationRecord">MutationRecord</a>, вторым аргументом является экземпляр <code>MutationObserver.</code></dd> </dl> <h2 id="Методы_экземпляра">Методы экземпляра</h2> <dl> <dt>{{domxref("MutationObserver.disconnect", "disconnect()")}}</dt> <dd>Прекращает получение уведомлений об изменении DOM-элемента экземпляром <code>MutationObserver</code>, до того момента пока не будет вызван метод <a href="#observe()">observe()</a>.</dd> <dt>{{domxref("MutationObserver.observe", "observe()")}}</dt> <dd>Подписывает экземпляр <code>MutationObserver</code> на получение уведомлений о манипуляциях с DOM-элементом.</dd> <dt>{{domxref("MutationObserver.takeRecords", "takeRecords()")}}</dt> <dd>Возвращает текущий {{jsxref("Array")}} очереди экземпляра <code>MutationObserver</code>, затем очищает её.</dd> </dl> <h2 id="MutationObserverInit"><code>MutationObserverInit</code></h2> <p><code>MutationObserverInit</code> — объект, который может содержать следующие свойства:</p> <div class="note"><strong>Примечание:</strong> Так или иначе необходимо установить <code>true</code> для одного из следующих свойств: <code>childList</code>, <code>attributes</code>, <code>characterData</code>. В противном случае будет вызвана ошибка "An invalid or illegal string was specified"</div> <table class="standard-table"> <tbody> <tr> <td class="header">Property</td> <td class="header">Description</td> </tr> <tr> <td><code>childList</code></td> <td> <p>true, если необходимо наблюдать за добавлением или удалением дочерних элементов (Включая текстовые узлы (text nodes))</p> </td> </tr> <tr> <td><code>attributes</code></td> <td> <p>true, если необходимо наблюдать за изменениями атрибутов целевого элемента.</p> </td> </tr> <tr> <td><code>characterData</code></td> <td> <p>true, если необходимо наблюдать за изменениями значения текстового содержимого целевого узла (текстовых узлов дочернего элемента).</p> </td> </tr> <tr> <td><code>subtree</code></td> <td> <p>true, если необходимо наблюдать за потомками целевого элемента. </p> </td> </tr> <tr> <td><code>attributeOldValue</code></td> <td> <p>true, если необходимо возвращать предыдущее значение атрибута. </p> </td> </tr> <tr> <td><code>characterDataOldValue</code></td> <td> <p>true, если необходимо возвращать предыдущее значение Data атрибута. </p> </td> </tr> <tr> <td><code>attributeFilter</code></td> <td> <p>Устанавливает массив названий атрибутов (без указания пространства имён), если требуется наблюдать за изменениями конкретных атрибутов. </p> </td> </tr> </tbody> </table> <h2 id="Mutation_Observer_customize_resize_event_listener_demo">Mutation Observer & customize resize event listener & demo</h2> <p><a href="https://codepen.io/webgeeker/full/YjrZgg/">https://codepen.io/webgeeker/full/YjrZgg/</a></p> <h2 id="Пример_использования">Пример использования</h2> <p>Приведённый ниже пример взят из <a href="http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/">этого блога</a>.</p> <pre class="brush: js">// Выбираем целевой элемент var target = document.getElementById('some-id'); // Конфигурация observer (за какими изменениями наблюдать) const config = { attributes: true, childList: true, subtree: true }; // Колбэк-функция при срабатывании мутации const callback = function(mutationsList, observer) { for (let mutation of mutationsList) { if (mutation.type === 'childList') { console.log('A child node has been added or removed.'); } else if (mutation.type === 'attributes') { console.log('The ' + mutation.attributeName + ' attribute was modified.'); } } }; // Создаём<code> </code>экземпляр наблюдателя с указанной функцией колбэка const observer = new MutationObserver(callback); // Начинаем наблюдение за настроенными изменениями целевого элемента<code> observer.observe(target, config); </code>// Позже можно остановить наблюдение<code> observer.disconnect();</code> </pre> <h2 id="Specifications">Спецификации</h2> {{Specifications}} <h2 id="Поддержка_браузерами">Поддержка браузерами</h2> <p>{{Compat}}</p> <h2 id="Смотрите_также">Смотрите также</h2> <ul> <li>{{domxref('PerformanceObserver')}}</li> <li>{{domxref('ResizeObserver')}}</li> <li>{{domxref('IntersectionObserver')}}</li> <li><a href="http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers" rel="freelink">Краткий обзор</a></li> <li><a href="http://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/" rel="freelink">Более детальное обсуждение</a></li> <li><a href="http://www.youtube.com/watch?v=eRZ4pO0gVWw" rel="freelink">Скринкаст от разработчика Chromium Rafael Weinstein</a></li> </ul>