Замена событий мутации DOM

Поскольку мутация DOM отмечена как устаревшая с помощью w3c (см. http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents), существует (быстрый) альтернативный способ обнаружения изменение атрибута в DOM?

Ответ 1

Насколько я знаю, нет альтернативы (пока), поэтому вы застряли с DOMAttrModified, который поддерживается только в Firefox и Opera. В IE у вас есть событие onpropertychanged, но нет возможности получить аналогичную функциональность в Chrome/Safari. Есть много вещей, которые вы могли бы сделать в зависимости от того, что вы пытаетесь выполнить, и браузеров, на которые вы нацеливаетесь:

  • определить получатели и сеттеры для атрибутов, которые вы хотите отслеживать.
  • методы переопределения, такие как document.createAttribute, attributes.setNamedItem,...

Я сам работаю над кросс-браузерным решением, но без особого успеха. Вы должны держаться подальше от мутационных событий, поскольку они не являются кросс-браузерами и очень медленными. Есть веские причины, по которым они устарели. Если вы хотите узнать больше, прочтите следующее:

Ответ 2

Причина, по которой события мутации были устаревшими, вызвана огромными проблемами производительности.

Замена Наблюдатели за мутациями, посмотрите 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 также будет поддерживать эту функцию.

Ответ 3

Через год есть новый и блестящий Mutation Observers от DOM Level 4 (следуйте ссылки там, они многое объясняют!). Где a Mutation Event срабатывает тысячу раз, MutationObserver срабатывает только один раз, когда все модификации содержатся и доступны.

Работает (по состоянию на 2017/03):

  • Firefox 14 +
  • IE 11
  • Край
  • Opera 15 +
  • Chrome 26+ (от 18 до 25 с префиксом, window.WebKitMutationObserver)
  • Safari 6.0 (префикс, window.WebKitMutationObserver)

Ответ 4

Большая замена для устаревших событий 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).