Подтвердить что ты не робот

Есть ли событие jquery, которое срабатывает, когда новый node вставлен в dom?

Есть ли событие jquery при срабатывании элемента dom, когда оно вставлено в dom?

например. скажем, я загружаю некоторый контент через ajax и добавляю его в DOM, а в другой части javascript я могу добавить событие с использованием .live(), так что, когда событие, соответствующее определенному селектору, добавляется в DOM, событие срабатывает при упомянутом элемент. Подобно $(document).ready(), но по содержимому, которое динамически добавляется в DOM.

О чем я мечтаю:

$('.myClass').live('ready', function() {
    alert('.myClass added to dom');
});

Если jquery не поддерживает такую ​​вещь, есть ли другой способ достичь этой функциональности, не изменяя код, который фактически выполняет начальную манипуляцию dom?

4b9b3361

Ответ 1

.livequery() плагин по-прежнему выполняет эту нишу, например:

$('.myClass').livequery(function() {
  alert('.myClass added to dom');
});

Если вы передадите ему только функцию обратного вызова, как описано выше, она будет выполняться для каждого нового найденного элемента, как изначально, так и по мере добавления. Внутри функции this ссылается на элемент с добавленной добавкой.

.live() прослушивает события, которые пузырятся, поэтому не соответствует этой ситуации "когда элементы добавлены", в этом отношении .livequery() (плагин) не был полностью заменен добавлением .live() до ядра, только часть пузырьков событий (по большей части) была.

Ответ 2

устаревший: согласно комментарию @Meglio ниже, событие DOMNodeInserted устарело и будет удалено из Интернета в какое-то неподдельное время в будущем. Для получения наилучших результатов начните изучение API MutationObserver.

см. @dain answer ниже.

Если вы привязываете 'DOMNodeInserted' событие к документу или телу напрямую, он будет выполняться каждый раз, когда что-либо будет вставлено в любом месте. Если вы хотите, чтобы callback запускался только при добавлении определенного типа элемента, было бы разумно использовать делегированные события.

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

$('body').on('DOMNodeInserted', '#common-parent', function(e) {
  if ($(e.target).attr('class') === 'myClass') {
    console.log('hit');
  }
});

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

Примечание:

$('body').on('DOMNodeInserted', '.myClass', function(e) {
  console.log(e.target);
});

Кажется, это тоже работает... но я не знаю почему.

Ответ 3

Если вы живете на переднем крае, вы можете использовать MutationObserver:)

  var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
  var list = document.querySelector('ol');

  var observer = new MutationObserver(function(mutations) {  
    mutations.forEach(function(mutation) {
      if (mutation.type === 'childList') {
        var list_values = [].slice.call(list.children)
            .map( function(node) { return node.innerHTML; })
            .filter( function(s) {
              if (s === '<br>') {
                return false;
              }
              else {
                return true;
              }
        });
        console.log(list_values);
      }
    });
  });

  observer.observe(list, {
    attributes: true, 
    childList: true, 
    characterData: true 
   });

Смотрите: https://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/

Изменить: этот ответ довольно старый, теперь MutationObserver поддерживается всеми браузерами, кроме Opera Mini: http://caniuse.com/#feat=mutationobserver

Кроме того, здесь прямая ссылка API на MDN: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

Ответ 4

Нет события jQuery, но есть событие DOM: DOMNodeInsertedIntoDocument. Вы можете прослушивать события DOM с помощью jQuery по методу. Итак:

$('.myClass').on('DOMNodeInsertedIntoDocument', function() {
  alert('myClass was inserted into the DOM');
}

Это может быть предпочтительнее использовать liveQuery, поскольку этот плагин немного устарел (без обновлений для 2+ лет, только promises поддержка jQuery 1.2.x).

Ответ 5

Взгляните на insertionQuery. Это интересная библиотека, которая использует CSS для обнаружения новых элементов. Поскольку он использует CSS, нет производительности, и вы возвращаете фактические элементы, соответствующие селектору.