Изменение состояния DOM
Постараюсь изложить задачу кратко.
Искал на здесь на форуме решение, перелопатил стековерфлов, но того что нужно не нашел. Подскажите как можно отслеживать изменения в DOM (добавление новых элементов, присвоение класов, изменение атрибутов и т.д.). В процессе поиска нашел события DOMMutationEvents, но вместе с ними полно жалоб на поддержку в браузерах. Пробовал решить задачу с помощью костыля: периодически проверять количество нодов в документе, но так нельзя проверить изменение атрибутов. Приведите пожалуйста пример скрипта, который будет кросбраузерным, будет проверять изменения в DOM. Желательно реальный работающий пример без костылей Буду благодарен за помощь. |
Так вам кроссбраузероно или без костылей?)
|
На ваше усмотрение. Из двух зол выбирайте меньше. Главное чтобы работало)
|
MutationObserver
<body> <div type="button" onclick="this.innerHTML='<span>clicked</span>'">click</div> <script>// select the target node var target = document.querySelector('body'); // create an observer instance var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { alert(mutation.type+'\n'+[].join.call(mutation.addedNodes,',')); }); }); // configuration of the observer: var config = { attributes: true, childList: true, subtree: true }; // pass in the target node, as well as the observer options observer.observe(target, config); // later, you can stop observing //observer.disconnect(); </script> </body> А для старых ie придётся танцевать с бубном. В интернете гулится вроде всякое на эту тему. На самом деле необходимости в подобных вещах при нормальной разработке нет. Вообще нет. Если какая-то функция что-то меняет в dom - вам надо просто следить за этой функцией, а не последствиями. |
Задача в тому, что сторонние скрипты изменяют DOM, а мой скрип должен следить за этими изменениями и реагировать некими действиями.
|
Можно проверять на изменение innerHTML.
|
Вообще правильный подход: проанализировать подключаемые скрипты, и подменять конкретные функции.
|
Сдается мне, такой скрипт должен будет через интервалы, причем очень краткие, каждый раз "гулять" по всем нодам , вести реестр аттрибутов и значений и сравнивать текущее с реестром.
И сдается мне будет экстремально тормозным на реальных страницах с контентом. Это жесть. Проще написать функцию которая будет "оповещать" об вставке в dom нового объекта или изменении аттрибута. Но тогда ее надо будет воткнуть во все скрипты после всех строк которые меняют dom, отчего вероятно они распухнут как винни пух |
Цитата:
|
krasovsky,
да нет, можно просто подменить (HTML)Element.prototype.appendChild итд.=) Но не нужно конечно. |
Часовой пояс GMT +3, время: 07:16. |