событие, которое срабатывает при изменении DOM структуры
ситуация такая. Есть html страничка, которая при старте подгружает несколько .js файлов (js`ники писал не я).
Следующим шагом происходит get запрос, который очевидно генерируется в одном из js файлов. В ответе - text/javascript функция, которая забивает данными определённый div. Моя задача заключается в следующем. Нужно перед вставкой данных из ответа обработать эти данные нужным мне образом и только потом вставить... триггер получается. Функцию, которая генерирует этот запрос, мне найти не удаётся (js-ники сильно перекручены). Соответственно доступа к функции-обработчику ответа у меня тоже нет. Но данные, полученные в respons`е мне нужно подкорректировать (доступа к php файла сервера нет, можно редактировать только js). Решение, которое приходит в голову - в window.onload отслеживать нужный мне div и, если в div были вставлены данные, то вызвать свою функцию, подкорректировать эти данные и вернуть обратно. Так вот как отследить изменение контента div`а я не знаю. Может кто-то ещё идею подкинет? Может в onload`e считать количество детей этого дива... |
var old = node.innerHTML; setInterval(function () { if (node.innerHTML != old) { /* handler */ } }, 100); |
Функцию, которая генерирует этот запрос, мне найти не удаётся поищите получше. Эту функцию фиг скроешь. Библиотека какая то используется, jQuery например ? p.s. вообще ваша деятельность - подозрительна - не доплатили программисту что ли ? |
exec, жестокая такая проверка. Тормозить работу не будет?
|
micscr, не будет.
|
2 exec:
спасобо за вариант решения буду пробовать. Вопрос ещё по ходу - нельзя ли при срабатывании if в конце блока удалить setInterval, чтобы вдальнейшем не делала лишних проверок? 2 micscr: подгружаются 2 js файла. оба используют jquery. функции в них начинаются так: function($){}(jquery), и внутри функций активно используются методи jquery. В этих js файлах для того, чтобы найти запрос я искал следующие функции/переменные : XmlHttpRequest, $.get, $.post, load(), getJSON(), getScript(). Такого там не было. Такой ещё вопрос. Как могут эти файлы использовать библиотеку jquery, если на клиента она не подгружалась? (смотрел в Fiddler`e) |
нельзя ли при срабатывании if в конце блока удалить setInterval, чтобы вдальнейшем не делала лишних проверок? конечно можно удалить. var inter = setInterval ... if (больше не надо) { clearInterval(inter); } Как могут эти файлы использовать библиотеку jquery, если на клиента она не подгружалась? должна была подгрузиться. Без неё бы не работало, а ведь работает? Смотри в FireBug-е. XmlHttpRequest, $.get, $.post, load(), getJSON(), getScript(). Такого там не было. А .ajax не искал? Поищи еще по расширению - php. И вообще - просмотри $(document).ready() - там скорее всего такая подгрузка инициируется. Можешь ссылку дать - вместе посмотрим. |
Вариант exec хорош, только если например будет модификация атрибутов то триггер тоже стработает.
|
http://tour-consulting.com.ua/samo/index.html
Вот этот сайт. Только я не в firebug`e смотрел, а в fiddler`e |
подзашифровано там просто пакером. jQuery есть.
|
Цитата:
|
раз есть jQuery значит аякс - запросы идут скорее всего через него. А в jQuery имеется обработчик $.ajaxSuccess() - наверное то что тебе надо - будет вызываться когда будут успешно завершаться аякс-запросы.
Выстави его в конце своего скрипта и изучай. |
спасибо большое, буду пробовать
|
Цитата:
|
Цитата:
|
Цитата:
|
DOM-объект, у которого нужно отследить изменение содержимого.
|
exec, я снова. Биндите Вы Ваш метод на node, так? Изменяется класс у потомка node. Бинго -- метод сработал. Еще раз повторюсь -ТС'у необходимо идти явно не этим путем.
|
Ну так и надо было сразу говорить, что речь идёт о потомке элемента, а не о нём самом.
Тогда можно сравнивать по innerText/textContent. |
Ок, не вопрос :) тогда делаем так (jQuery):
$(":first-child", node).wrap(document.createElement("DIV")); Изменение DOM налицо :) Изменения innerText/textContent вроде как нет. |
В таком случае можно добавить проверку на кол-во всех потомков элемента.
|
exec, отлично :) Еще пример (взял с jqueri api, влом придумывать):
$("button").click(function() { $(this).replaceWith("<div>" + $(this).text() + "</div>"); }); |
UPD: Описанные выше действия происходят так быстро, что setInterval не успевает их засечь. Но, думаю, всё равно можно какой-нибудь костыль придумать. |
exec, DOM Mutation Event уже придумали за Вас :) А костыли -- они для инвалидов, в конце концов.
|
Воспользовался методом exec, за что ему спасибо. Ни .ajaxSuccess(), ни .ajaxError() не реагировали на get запрос, который шёл по умолчанию. Когда я подменил этот запрос своим (отправлял его первым), то срабатывал .ajaxError(), в теле ответа которого ничего не было, хотя в firebuge был виден ответ сервера + статус 200.
|
Я еще тогда но не сильно вникая смотрел, что это не ajax запрос походу - так как на другой домен. Наверное - через <script> и innerHTML.
Если использовал метод exec то добавлял следующую строку ? : var old = node.innerHTML; setInterval(function () { if (node.innerHTML != old) { var old = node.innerHTML; /* handler */ } }, 100); |
Вот так делал:
function resultset_link() { var old = $('#resultset').eq(0).html(); var inter=setInterval(function () { if ($('#resultset').eq(0).html() != old) { /*handler;*/ clearInterval(inter); } }, 100); }; Там есть вызов такого типа: $.remoteScript('get', param1,{},param2). Только вот синтаксис этой функции на jquery.com я не нашёл. |
ну так нормально - если засечь только как один раз вначале отработает. Так же надо было?
|
да. обработчик должен был отработать только один раз.
Есть ещё вопрос, который было бы интересно узнать... как в этих библиотеках используется JQuery, при этом не подгружая библиотеку на клиента? |
Ага, я уже посмотрел - ты в обработку нажатия кнопки вызов этой функции запихнул. Работает - и нормально.
|
Есть событие "onDOMSubtreeModified". Срабатывает при изменении в DOM-элемента. В обработчике событий, разумеется, объявляется как "DOMSubtreeModified".
|
Часовой пояс GMT +3, время: 08:00. |