Замена событий мутации DOM
Поскольку мутация DOM помечена как устаревшая в w3c (см. http://www.w3.org/TR/DOM-Level-3-Events/), существует ли (быстрый) альтернативный способ обнаружения модификации атрибута в ДОМ?
4 ответа
Насколько я знаю, нет альтернативы (пока), поэтому вы застряли с DOMAttrModified
который поддерживается только в Firefox и Opera. В IE у вас есть onpropertychanged
событие, но нет никакого способа получить подобную функциональность в Chrome / Safari. Есть несколько вещей, которые вы можете сделать в зависимости от того, что вы пытаетесь выполнить, и браузеров, на которые вы ориентируетесь:
- определите методы получения и установки для атрибутов, которые вы хотите отслеживать
- переопределить методы, такие как
document.createAttribute
,attributes.setNamedItem
...
Я сам работал над кросс-браузерным решением, но без особого успеха. Вы должны держаться подальше от событий мутации все вместе, так как они не кросс-браузерные и очень медленные. Есть веские причины, почему они устарели. Если вы хотите узнать больше, прочитайте это:
Причина, по которой события мутации устарели, была вызвана огромными проблемами с производительностью.
Замена - " Наблюдатели мутаций", посмотрите http://updates.html5rocks.com/2012/02/Detect-DOM-changes-with-Mutation-Observers и https://developer.mozilla.org/en/DOM/DOM_Mutation_Observers
Информация о мутациях доставляется наблюдателям в виде упорядоченной последовательности MutationRecords, представляющей наблюдаемую последовательность произошедших изменений
Пример использования:
var observer = new MutationObserver(function(mutationRecords) {
// Handle mutations
});
observer.observe(myNode,
{ // options:
subtree: true, // observe the subtree rooted at myNode
childList: true, // include information childNode insertion/removals
attribute: true // include information about changes to attributes within the subtree
});
Это поддерживается в ночных сборках Chrome 18 и Firefox и Webkit. Firefox 14 также будет поддерживать эту функцию.
Отличная замена устаревшим событиям DOM* animationStart
в сочетании с анимацией CSS. Дэвид Уолш пишет о методе.
Сначала настройте ключевые кадры и примените их к элементам, которые вы хотите прослушать (не забудьте префиксы вендора!):
@keyframes nodeInserted {
from { clip: rect(1px, auto, auto, auto); }
to { clip: rect(0px, auto, auto, auto); }
}
#parentElement > li {
animation-duration: 0.001s;
animation-name: nodeInserted;
}
Затем добавьте слушателя:
var insertListener = function(event){
if (event.animationName == "nodeInserted") {
// This is the debug for knowing our listener worked!
// event.target is the new node!
console.warn("Another node has been inserted! ", event, event.target);
}
}
document.addEventListener("animationstart", insertListener, false); // standard + firefox
document.addEventListener("MSAnimationStart", insertListener, false); // IE
document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari
Та-да! Вот демо Дэвида. Он прекрасно работает для меня с расширением Chrome, которое добавляет картинки Facebook в Google Voice (см. Content.css и injected.js).
Год спустя появились новые и блестящие Mutation Observers
из DOM Level 4 (перейдите по ссылкам, они многое объясняют!). Где Mutation Event
выстрелил тысячу раз, MutationObserver
срабатывает только один раз со всеми модификациями, содержащимися и доступными.
Работы для (по состоянию на 2017/03):
- Firefox 14+
- IE 11
- край
- Опера 15+
- Chrome 26+ (с 18 до 25 с префиксом,
window.WebKitMutationObserver
) - Safari 6.0 (с префиксом,
window.WebKitMutationObserver
)