Работает ли jQuery.on () для элементов, которые добавляются после создания обработчика событий? - PullRequest
21 голосов
/ 22 марта 2012

Все это время у меня было впечатление, что .on() работает как .live() в отношении динамически создаваемых элементов (например, я использую $('.foo').on('click', function(){alert('click')});, а затем создается элемент с классом foo из-за некоторого AJAX, теперь я ожидаю, что щелчок по этому элементу вызовет предупреждение). На практике это были не те результаты, которые я получил. Я мог ошибиться, но кто-нибудь мог бы помочь мне понять новый способ достижения этих результатов после .on()?

Заранее спасибо.

Ответы [ 2 ]

71 голосов
/ 22 марта 2012

.on() работает с динамически созданными элементами, если он используется правильно. jQuery doc довольно неплохо описывает его.

Способ использовать его для динамических элементов - использовать эту форму:

$("static selector").on('click', "dynamic selector", fn);

Статический селектордолжен разрешаться для некоторого объекта, который является и предком ваших динамических объектов и является статическим - присутствует при запуске этой строки кода и не будет удален или воссоздан.

Динамический селектор - это селектор, который соответствуетваши динамические элементы.Они не должны существовать во время первой установки обработчика событий, и они могут приходить и уходить так часто, как вы хотите.

Итак, если "#container" соответствует статическому предку, а ".foo" соответствует вашей динамическойэлементы, для которых вы хотите обработчики кликов, вы должны использовать это;

$("#container").on("click", ".foo", fn);

Если вы действительно хотите это понять, то именно так работает делегированная обработка событий .on().Когда вы выполняете вызов .on() выше, он прикрепляет обработчик события click к объекту #container.Некоторое время спустя, когда вы щелкаете по объекту .foo, на самом объекте .foo нет обработчика щелчка, поэтому щелчок всплывает в цепочке предков.Когда щелчок достигает объекта #container, появляется обработчик щелчка, и jQuery смотрит на этот обработчик и видит, что этот обработчик предназначен только для объектов, для которых исходный объект, на который щелкнули, соответствует селектору ".foo".Он проверяет цель события, чтобы определить, соответствует ли она этому селектору, и если да, то вызывает для нее обработчик события.

(в настоящее время не рекомендуется) метод .live(), работающий путем присоединения всех обработчиков событий к объекту документа.,Поскольку объект документа является предком каждого объекта в документе, они получили делегированное управление событиями таким образом.Итак, в приведенном выше примере эти два эквивалента:

$(document).on("click", ".foo", fn);
$(".foo").live("click", fn);

Но присоединение всех делегированных обработчиков событий к документу иногда создает серьезное узкое место в производительности, поэтому jQuery решил, что это плохой способ сделать это, и этоЛучше потребовать, чтобы разработчик указал статического предка, который, как мы надеемся, был ближе к реальному целевому объекту, чем объект документа.

1 голос
/ 22 марта 2012

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

Связывание событий Jquery с элементами, созданными с помощью других событий

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