Реализация слушателя DOM - PullRequest
2 голосов
/ 06 марта 2012

Я думал, что нет слушателя DOM, поэтому я реализовал свой собственный «тяжелый» слушатель:

function CvHelper(stackApi) {
  var that = this;

  // check if room is finished loading
  this.init = function() {
    if ($('#loading').length) {
      setTimeout(that.init, 1000);
    } else {
      console.log('Chatroom finished loading');

      that.postListener();
    }
  }
}

(function() {
  var stackApi = new StackApi();
  var cvHelper = new CvHelper(stackApi);
  cvHelper.init();
})();

Я думаю, это просто отстой. Поэтому я выполнил поиск по SO, и этот вопрос всплыл. Однако в последнем комментарии к принятому вопросу говорится, что он устарел.

$("#someDiv").bind("DOMSubtreeModified", function() {
  alert("tree changed");
});

w3.org / TR / DOM-Level-3-Events / # event-type-DOMSubtreeModified говорит, что это событие устарело, что бы мы использовали вместо него?

Есть ли подстановка для него?
Постскриптум Это должно работать только на Chrome, потому что это расширение Chrome.

Ответы [ 3 ]

3 голосов
/ 04 июля 2014

Событие Mutation устарело из-за проблем с производительностью. Поэтому, пожалуйста, используйте Mutation Observer . Я сделал слушателя изменений DOM в одном из моих проектов, используя Mutation Observer, и он работал отлично! Для вашей дальнейшей реализации вам помогут следующие ссылки:

  1. http://gabrieleromanato.name/jquery-detecting-new-elements-with-the-mutationobserver-object/
  2. https://github.com/kapetan/jquery-observe
  3. Есть ли прослушиватель изменений DOM JavaScript / jQuery?
2 голосов
/ 06 марта 2012

Если вы посмотрите на:

http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-MutationEvent

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

Поэтому, если вы используете другое MutationEvent, скажем, DOMNodeInserted, вы можете получить более детерминированный запуск событий (вам просто нужно добавить элемент к узлу в этом конкретном случае).

См. Ниже:

$('body').prepend( $('<div id="cow">Hello</div>') );

$('#cow').bind("DOMNodeInserted",function(){ alert('hi'); } );

$('#cow').prepend( $("<div></div>") );

Это было проверено в Chrome, кстати.

Надеюсь, это поможет ...

UPDATE: Кроме того, вы можете добавить более одного типа события в один вызов функции. Например, добавив четыре обработчика событий для DOMNodeInserted, DOMNodeRemoved, DOMAttrModified, DOMCharacterDataModified, затем все обработчики вызывают один обработчик.

ОБНОВЛЕНИЕ: я написал небольшой скрипт, который делает то, что я только что написал в предыдущем обновлении:

$('body').prepend( $('<div id="cow">Hello</div>') );

/**
* This function registers event handlers which invoke the mutateHandler 
* handler when any of the MutationEvents are fired on a node: DOMNodeInserted, 
* DOMNodeRemoved, DOMAttrModified, DOMCharacterDataModified.
*
*/
var onMutate = function( mutateHandler ){

    var that = this;
    $(this).bind( "DOMNodeInserted", function( event ){ 
        mutateHandler.call( that, event ); 
    });
    $(this).bind( "DOMNodeRemoved", function( event ){ 
        mutateHandler.call( that, event ); 
    });
    $(this).bind( "DOMAttrModified", function( event ){ 
        mutateHandler.call( that, event );
    });
    $(this).bind( "DOMCharacterDataModified", function( event ){ 
        mutateHandler.call( that, event );
    });

};

onMutate.call( $('#cow')[0], function(){
    alert( $(this).attr('id') );
});


$('#cow').prepend( $("<div></div>") );
$('#cow').addClass( 'my_class' );
0 голосов
/ 06 марта 2012

Похоже, что на самом деле он устарел только в рабочем проекте События уровня 3 DOM , который содержит следующее примечание:

Внимание! Интерфейс MutationEvent был представлен в DOM Level 2 События, но еще не были полностью и совместимо реализованы через пользовательских агентов. Кроме того, была критика, что Интерфейс, как и задумано, представляет производительность и реализацию вызов. Новая спецификация находится в стадии разработки с целью обращаясь к случаям использования, которые решают события мутации, но в более исполнительная манера. Таким образом, эта спецификация описывает события мутации для справки и полноты унаследованного поведения, но не одобряет использование как интерфейса MutationEvent, так и MutationNameEvent интерфейс.

Так что, если я правильно понимаю, ответ на вопрос "Есть ли замена еще?" это «нет, еще нет».

...