JQuery - выполнение кода для каждого нового экземпляра объекта DOM
Мне интересно, возможно ли это в JQuery.
У меня есть некоторый код Javascript, который создает объекты DOM на лету в ответ на действия пользователя. Некоторые из этих объектов DOM имеют определенную структуру - контейнер всегда имеет один и тот же атрибут "класс".
Я хотел бы, чтобы каждый раз, когда создавался новый экземпляр объекта DOM с классом "X", я хотел, чтобы выполнялся один и тот же фрагмент кода Javascript. Этот код добавит событие "onclick" к этому объекту DOM.
К сожалению, я не могу просто поместить код, который назначает onclick, в document.Ready(), поскольку объекты, к которым он привязан, создаются на лету, еще долго после того, как document.Ready () был выполнен.
Позволяет ли JQuery устанавливать постоянные привязки, которые будут автоматически связаны с типом объекта DOM, даже если он генерируется на лету?
4 ответа
Раньше это покрывалось "live", "делегатом" или иногда "bind". Теперь они заменены на "вкл", однако есть несколько предостережений, которые обсуждались здесь: Постоянство привязки событий Javascript
Я думаю, что нашел удивительный ответ на свой вопрос прямо в документации по JQuery.
http://docs.jquery.com/Events/live
live( type, fn )
Добавлено в jQuery 1.3: привязывает обработчик к событию (например, нажатию) для всех текущих и будущих элементов. Можно также связать пользовательские события.
Вы смотрели плагин jQuery под названием LiveQuery?
Со страницы документации LiveQuery:
Например, вы можете использовать следующий код для привязки события click ко всем тегам A, даже к любым тегам A, которые вы можете добавить через AJAX.
$('a')
> .livequery('click', function(event) {
> alert('clicked');
> return false;
> });
Как только вы добавите новые теги A в ваш документ, Live Query свяжет событие click, и больше ничего не нужно будет вызывать или делать.
Невозможно в ядре jQuery (как вы, вероятно, поняли с другими ответами, ссылающимися на некоторые плагины)... это может быть очень простой задачей, если вам необязательно нужна вся функциональность чего-то вроде livequery
Для браузеров, которые их поддерживают - используйте событие DOM level 2 - 'DOMNodeInserted':