我的印象是 jQuery 的on
事件处理程序旨在能够“监听”动态创建的元素,并且它应该替换live
. 但是,我所经历的是 usingon
没有捕获点击事件,而 usinglive
是成功的!
我的情况的棘手方面是,我不仅在动态创建内容,而且通过 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
我却失败了。
这不是“我怎样才能让它工作”的问题,因为我发现如果我在回调中声明on
它会成功(捕获点击) 。function(formToDisplay)
我的问题是:on
在模态弹出窗口中找不到我动态创建的元素有什么问题?我的 jQuery 实例是 jquery-1.7.2。jQueryUI 是 1.8.21。
这是两个近似该问题的jsFiddles。在两个实例中单击“测试”一词以查看不同的行为。代码的唯一区别是替换on
for live
。
点击被捕获的位置live
。
未捕获单击的位置on
(单击“测试-单击我”以查看没有任何反应)。
我意识到我可能只是使用on
不当或要求它做一些不打算做的事情,但我想知道它为什么不起作用(但如果你有一些非常聪明的东西,请随时分享)。谢谢你的智慧!
更新/回答/解决方案:
根据用户“未定义”,不同之处在于on
不是从document
对象的顶部一直委托,而live
确实/是。
正如克劳迪奥所提到的,on
文档的某些部分引用了动态创建的元素,并且您在$("")
查询部分中包含的内容需要在运行时存在。
这是我的新解决方案:捕获单击事件on
我的模态对话框,虽然它在运行时创建事件时没有任何内容,但将能够找到我的内容和具有稍后生成的特殊类的元素。
$("#dialog").on("click", ".classThatExistsInFormToDisplay", function() {
... //(success! Event captured)
});
非常感谢!