Есть ли событие jquery, которое срабатывает, когда новый узел вставляется в dom?
есть ли событие jQuery срабатывает на элемент dom, когда он вставляется в dom?
о чем я мечтаю оф:
$('.myClass').live('ready', function() {
alert('.myClass added to dom');
});
Если jquery не поддерживает такую вещь, то есть ли другой способ, которым я мог бы достичь этой функциональности без изменения кода, который фактически выполняет начальную манипуляцию dom?
5 ответов:
The
.livequery()
плагин до сих пор служит этой нише нужно, как это:$('.myClass').livequery(function() { alert('.myClass added to dom'); });
если вы передадите его просто функция обратного вызова, как и выше, она будет работать для каждого нового элемента, который она находит, как изначально, так и по мере их добавления. Внутри функции
this
относится к только что добавленному элементу.
.live()
прослушивает события, которые пузырятся, поэтому не соответствует этой ситуации "при добавлении элементов", в этом отношении,.livequery()
(плагин) не полностью заменено добавлением.live()
к ядру, только часть события клокоча (по большей части) была.
устаревший: согласно комментарию @Meglio ниже,
DOMNodeInserted
событие устарело и будет удалено из интернета в какое-то неизвестное время в будущем. Для достижения наилучших результатов, начните изучать MutationObserver API.см. @ dain's answer ниже.
если вы связываете 'DOMNodeInserted событие к документу или телу напрямую, он будет выполняться каждый раз, когда что-либо вставляется куда угодно. Если вы хотите, чтобы обратный вызов выполнялся только при добавлении определенного типа элемента, было бы разумно использовать делегированные события.
обычно, если вы добавляете класс элементов в 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); });
Это, кажется, тоже работают... но я не знаю, почему.
Если вы живете на переднем крае вы можете использовать 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 });
Edit: этот ответ довольно старый, теперь MutationObserver поддерживается всеми браузерами, кроме Opera Mini:http://caniuse.com/#feat=mutationobserver
кроме того, вот прямая ссылка на API на MDN: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
нет события jQuery, но есть событие DOM: DOMNodeInsertedIntoDocument. Вы можете прослушивать события DOM, используя метод jQuery on. Итак:
$('.myClass').on('DOMNodeInsertedIntoDocument', function() { alert('myClass was inserted into the DOM'); }
Это может быть предпочтительнее, чем использовать liveQuery, поскольку этот плагин немного устарел (никаких обновлений в течение 2+ лет, только обещает поддержку jQuery 1.2.икс.)
посмотри insertionQuery. Это интересная библиотека, которая использует CSS для обнаружения новых элементов. Поскольку он использует CSS, нет хита производительности, и вы получаете возвращенные фактические элементы, соответствующие селектору.