jQuery 'on' не регистрируется в динамически генерируемом модальном всплывающем окне
У меня сложилось впечатление, что jQueryon
обработчик события должен был иметь возможность «слушать»; для динамически создаваемых элементов И что он должен был заменить поведениеlive
, Однако, что я испытал, так это то, чтоon
не захватывает событие щелчка при использованииlive
успешно!
Хитрый аспект моей ситуации заключается в том, что я не только динамически создаю контент, но и делаю это через AJAX..get()
вызов и вставка результирующего HTML в модальный.dialog()
jQueryUI всплывающее окно.
Вот упрощенная версия того, что я пытался сделать (завернутый в$(document).ready(...)
):
$.get("getUserDataAjax.php", queryString, function(formToDisplay) {
$("#dialog").dialog({
autoOpen: true,
modal: true,
buttons...
}).html(formToDisplay);
});
$(".classThatExistsInFormToDisplay").on("click", function() {
alert("This doesn't get called");
});
Из документации дляon
Я нашел то, к чему я подходил, когда писал своиon
событие:
$("p").on("click", function(){
alert( $(this).text() );
});
Однако по какой-то причинеlive
будет работать как я ожидаю - тогда какon
подводит меня.
This isn't a question for "how can I make it work" потому что я обнаружил, чтоon
будет успешным (захватывать клики), если я объявлю этоinside function(formToDisplay)
Перезвоните.
My question is: что не так сon
что он не находит мои динамически созданные элементы в модальном всплывающем окне? Мой экземпляр jQuery - jquery-1.7.2. jQueryUI - 1.8.21.
Вот два jsFiddles, которые приближают проблему. Нажмите на слово & quot; Тест & quot; в обоих случаях увидеть разное поведение. Единственная разница в коде заменяетon
заlive
.
кудащелчок захваченlive
.
кудащелчок НЕ захваченon
(нажмите «Тест» - нажмите «Мне», чтобы ничего не произошло).
Я понимаю, что могу просто использоватьon
ненадлежащим образом или просить его сделать что-то, что не было предназначено, но я хочу знать,why это не работает (но если у вас есть что-то очень умное, не стесняйтесь поделиться). Спасибо за вашу мудрость!
Update / Answer / Solution:
Согласно пользователю "undefined", разница в том, чтоon
не делегированы полностью от вершиныdocument
объект тогда какlive
делает / является.
Как отмечает Клаудио, есть частиon
документация, которая ссылается на динамически созданные элементыand that что вы включаете в$("")
часть запросаneeds to exist at runtime.
Вот мое новое решение: захват событий кликовon
Мой модальный диалог, который, хотя и не имеет никакого контента при создании события во время выполнения, сможет найти мой контент и элемент с помощью специального класса, который генерируется позже.
$("#dialog").on("click", ".classThatExistsInFormToDisplay", function() {
... //(success! Event captured)
});
Спасибо!