MutationObserver: метод observe()
Базовая поддержка Широко распространена
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Метод MutationObserver observe() настраивает MutationObserver коллбек для начала получения уведомлений о изменениях в DOM, которые соответствуют заданным параметрам.
В зависимости от конфигурации, наблюдатель может следить за одним Node в дереве DOM, или за этим узлом и некоторыми или всеми его дочерними узлами. Один и тот же узел может наблюдаться несколькими наблюдателями, и один и тот же MutationObserver может отслеживать изменения в разных частях дерева DOM и/или разных типах изменений, вызывая observe() несколько раз для того же MutationObserver.
Чтобы остановить MutationObserver (чтобы ни один из его коллбеков больше не срабатывал), вызовите MutationObserver.disconnect().
Синтаксис
observe(target, options)
Параметры
target-
Узел DOM
Node(который может бытьElement) в дереве DOM, за изменениями которого нужно наблюдать, или узел, являющийся корнем поддерева узлов, за которыми нужно наблюдать. options-
Объект, предоставляющий параметры, которые описывают, какие мутации DOM должны быть сообщены
mutationObserver'scallback. Как минимум, один изchildList,attributes, и/илиcharacterDataдолжен бытьtrueпри вызовеobserve(). В противном случае будет брошено исключениеTypeError.Параметры следующие:
subtreeНеобязательно-
Установите в
trueчтобы расширить мониторинг на всё поддерево узлов, укорененное вtarget. Все остальные свойства затем расширяются на все узлы в поддереве вместо применения только к узлуtarget. Значение по умолчанию —false. Обратите внимание, что если дочерний узелtargetудаляется, изменения в этом поддереве дочерних узлов будут продолжать наблюдаться до тех пор, пока не будет доставлено уведомление об удалении. childListНеобязательно-
Установите в
trueдля мониторинга целевого узла (и, еслиsubtreeравенtrue, его потомков) для добавления новых дочерних узлов или удаления существующих дочерних узлов. Значение по умолчанию —false. attributesНеобязательно-
Установите в
trueдля отслеживания изменений значения атрибутов узла или узлов, за которыми ведется наблюдение. Значение по умолчанию —trueесли указан любой изattributeFilterилиattributeOldValue, в противном случае значение по умолчанию —false. attributeFilterНеобязательно-
Массив имен конкретных атрибутов, за которыми необходимо следить. Если это свойство не включено, изменения всех атрибутов вызывают уведомления о мутациях.
attributeOldValueНеобязательно-
Установите в
trueдля записи предыдущего значения любого атрибута, который изменяется при мониторинге узла или узлов на предмет изменений атрибутов; см. Мониторинг значений атрибутов для примера наблюдения за изменениями атрибутов и записи значений. Значение по умолчанию —false. characterDataНеобязательно-
Установите в
trueдля мониторинга указанного целевого узла (и, еслиsubtreeравенtrue, его потомков) на предмет изменений символьных данных, содержащихся в узле или узлах. Значение по умолчанию —trueесли указанcharacterDataOldValue, в противном случае значение по умолчанию —false. characterDataOldValueНеобязательно-
Установите в
trueдля записи предыдущего значения текста узла всякий раз, когда текст изменяется в наблюдаемых узлах. Значение по умолчанию —false.
Возвращаемое значение
Нет (undefined).
Исключения
TypeError-
Бросается в следующих обстоятельствах:
optionsнастроены таким образом, что ничего фактически не будет отслеживаться. (Например, еслиchildList,attributes, иcharacterDataвсеfalse.)- Значение
options.attributesравноfalse(указывает, что изменения атрибутов не должны отслеживаться), ноattributeOldValueравноtrueи/илиattributeFilterприсутствует. - Параметр
characterDataOldValueравенtrue, ноcharacterDataравенfalse(указывает, что изменения символьных данных не должны отслеживаться).
Примеры
Базовое использование
В этом примере показано, как вызвать метод observe() на экземпляре MutationObserver, после его настройки, передав ему целевой элемент и объект options.
// create a new instance of `MutationObserver` named `observer`,
// passing it a callback function
const observer = new MutationObserver(() => {
console.log("callback that runs when observer is triggered");
});
// call `observe()`, passing it the element to observe, and the options object
observer.observe(document.querySelector("#element-to-observe"), {
subtree: true,
childList: true,
});
Удаленные дочерние узлы при использовании subtree
Если вы наблюдаете за узлом с помощью параметра subtree, вы будете продолжать получать уведомления об изменениях в потомках узла, даже после удаления части поддерева. Однако после получения уведомления об удалении дальнейшие изменения в отделенном поддереве больше не будут вызывать наблюдателя.
Это предотвращает пропуск изменений, которые происходят после разрыва соединения и до того, как у вас будет возможность начать специально отслеживать перемещенный узел или поддерево на предмет изменений. Теоретически, это означает, что если вы отслеживаете объекты MutationRecord, описывающие происходящие изменения, вы должны иметь возможность "отменить" изменения, возвращая DOM к исходному состоянию.
<div id="target"> <div id="child"></div> </div>
const target = document.getElementById("target");
const child = document.getElementById("child");
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
console.log(mutation.type, mutation.target.id, mutation.attributeName);
if (mutation.type === "childList" && mutation.target.id === "target") {
// After receiving the notification that the child was removed,
// further modifications to the detached subtree no longer trigger the observer.
child.setAttribute("data-bar", "");
}
});
});
observer.observe(target, {
attributes: true,
childList: true,
subtree: true,
});
target.removeChild(child);
// This change happens before the "childList target" notification is delivered,
// so it will also trigger the observer.
child.setAttribute("data-foo", "");
// Output:
// childList target null
// attributes child data-foo
// There is no "attributes child data-bar" notification.
Использование attributeFilter
В этом примере наблюдатель мутаций настроен для отслеживания изменений в атрибутах status и username во всех элементах, содержащихся в поддереве, отображающем имена пользователей в чате. Это позволяет коду, например, отражать изменения псевдонимов пользователей или отмечать их как отсутствующих (AFK) или оффлайн.
function callback(mutationList) {
mutationList.forEach((mutation) => {
switch (mutation.type) {
case "attributes":
switch (mutation.attributeName) {
case "status":
userStatusChanged(mutation.target.username, mutation.target.status);
break;
case "username":
usernameChanged(mutation.oldValue, mutation.target.username);
break;
}
break;
}
});
}
const userListElement = document.querySelector("#user-list");
const observer = new MutationObserver(callback);
observer.observe(userListElement, {
attributeFilter: ["status", "username"],
attributeOldValue: true,
subtree: true,
});
Мониторинг значений атрибутов
В этом примере мы наблюдаем за элементом на предмет изменений значений атрибутов и добавляем кнопку, которая переключает атрибут dir элемента между "ltr" и "rtl". Внутри коллбека наблюдателя мы выводим старое значение атрибута.
HTML
<button id="toggle">Toggle direction</button><br /> <div id="container"> <input type="text" id="rhubarb" dir="ltr" value="Tofu" /> </div> <pre id="output"></pre>
CSS
body {
background-color: paleturquoise;
}
button,
input,
pre {
margin: 0.5rem;
}
JavaScript
const toggle = document.querySelector("#toggle");
const rhubarb = document.querySelector("#rhubarb");
const observerTarget = document.querySelector("#container");
const output = document.querySelector("#output");
toggle.addEventListener("click", () => {
rhubarb.dir = rhubarb.dir === "ltr" ? "rtl" : "ltr";
});
const config = {
subtree: true,
attributeOldValue: true,
};
const callback = (mutationList) => {
for (const mutation of mutationList) {
if (mutation.type === "attributes") {
output.textContent = `The ${mutation.attributeName} attribute was modified from "${mutation.oldValue}".`;
}
}
};
const observer = new MutationObserver(callback);
observer.observe(observerTarget, config);
Результат
Спецификации
| Спецификация |
|---|
| DOM # ref-for-dom-mutationobserver-observe② |
Совместимость браузеров
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
observe |
18Перед Chrome 33, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Chrome выдаст синтаксическую ошибку. |
12Перед Edge 79, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Edge выдаст синтаксическую ошибку. |
14Перед Firefox 36, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Firefox выдаст синтаксическую ошибку. |
15Перед Opera 20, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Opera выдаст синтаксическую ошибку. |
6Перед Safari 10.1, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Safari выдаст синтаксическую ошибку. |
18Перед Chrome Android 33, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Chrome Android выдаст синтаксическую ошибку. |
14Перед Firefox для Android 36, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Firefox для Android выдаст синтаксическую ошибку. |
14Перед Opera Android 20, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Opera Android выдаст синтаксическую ошибку. |
6Перед Safari iOS 10.3, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Safari выдаст синтаксическую ошибку. |
1.0Перед Samsung Internet 2.0, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, Samsung Internet выдаст синтаксическую ошибку. |
4.4Перед WebView 4.4.3, необходимоattributes: true при использовании attributeFilter или attributeOldValue. Если attributes: true отсутствует, WebView выдаст синтаксическую ошибку. |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe