livequery для обнаружения изменений в домене - PullRequest
0 голосов
/ 17 ноября 2009

Как я могу обнаружить изменения в DOM, такие как обновленный innerHTML и т. Д., Используя livequery JQuery.

Я пробовал, как показано ниже

Сценарий -

var matched = function() {
        alert('detected');
};
var unmatched = function() {
    alert('removed')
};

$('div#container').livequery(matched, unmatched)

HTML -

<BODY onload="setTimeout(function(){
        document.getElementById('container').innerHTML = 'updated test';    },3000);">

  <div id="container">test</div>
 </BODY>

Но это не работает.

Спасибо, Sourabh

1 Ответ

2 голосов
/ 17 ноября 2009

То, что вы пытаетесь сделать - это не то, для чего предназначен плагин livequery .

$('div#container').livequery(matched, unmatched);

Это говорит livequery:

  • вызывает совпавшую функцию, когда div с идентификатором container найден или добавлен в DOM с помощью одного из методов манипулирования DOM jQuery
  • вызывает непревзойденную функцию, когда div с ранее найденным идентификатором container был удален (или id изменен) из DOM с помощью одного из методов манипуляции DOM jQuery

Таким образом, с вашим образцом будет выдано только оповещение о том, что обнаружено при загрузке страницы. Поскольку изменение innerHTML не добавляет и не удаляет div с идентификатором контейнера, livequery должен ничего не делать, и именно это он и делает.


Использование * (вместо div#container) вызовет только пару предупреждений при загрузке страницы, но снова не будет срабатывать, если вы используете методы JQuery DOM-Manipulation.

document.getElementById('container').innerHTML = 'updated test';

Не запускается matched() как # 1, вы не используете jQuery для выполнения манипуляций; # 2 вы не добавляете новый элемент, который * будет соответствовать.

document.getElementById('container').innerHTML = '<p>updated test</p>'

Не запускается matched(), так как вы не используете jQuery для выполнения манипуляции (хотя вы добавляете элемент <p>, который будет соответствовать селектору *, но не будет зарегистрирован в livequery, поскольку он только прослушивает методы JQuery DOM-манипуляции (и только их выбор).

Если вместо этого вы используете

$("#container").html('<p>updated test</p>');

Сработает matched() через 3 с. Если вы только делаете

$("#container").html('updated test');

matched() не будет запущено, так как не было добавлено ничего, что соответствовало бы селектору *, изменился только innerHTML уже соответствующего элемента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...