jQuery.on()是否适用于创建事件处理程序后添加的元素



我一直认为.on()在动态创建的元素方面与.live()类似(例如,我使用$('.foo').on('click', function(){alert('click')});,然后由于一些AJAX创建了一个类为foo的元素,现在我希望点击该元素会引起警报)。在实践中,这些并不是我得到的结果。我可能犯了一个错误,但有人能帮助我理解.on()之后实现这些结果的方法吗?

提前谢谢。

.on()如果使用得当,可以与动态创建的元素一起使用。jQuery文档很好地描述了它

将其用于动态元素的方法是使用以下形式:

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

静态选择器必须解析为某个对象,该对象既是动态对象的祖先,又是静态的——在运行这行代码时存在,不会被删除或重新创建。

动态选择器是一个与动态元素匹配的选择器。它们不必在第一次安装事件处理程序时就存在,而且它们可以根据您的需要来来去去。

因此,如果"#container"与静态祖先匹配,而".foo"与您想要点击处理程序的动态元素匹配,那么您将使用它;

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

如果您真的想了解它,.on()的委托事件处理就是这样工作的。当您进行上面的.on()调用时,它将一个单击事件处理程序附加到#container对象。稍后,当您单击.foo对象时,实际的.foo对象上没有单击处理程序,因此单击会弹出祖先链。当点击到达#container对象时,有一个点击处理程序,jQuery查看该处理程序,发现该处理程序仅适用于原始点击对象与选择器".foo"匹配的对象。它测试事件目标,看看它是否与选择器匹配,如果匹配,它会调用它的事件处理程序

(现在已弃用).live()方法通过将所有事件处理程序附加到文档对象来工作。由于文档对象是文档中每个对象的祖先,因此他们可以通过这种方式获得委托事件处理。因此,在上面的例子中,这两个是等价的:

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

但是,在文档上附加所有委托的事件处理程序有时会造成严重的性能瓶颈,因此jQuery认为这是一种糟糕的方法,最好要求开发人员指定一个静态祖先,希望它比文档对象更接近实际目标对象。

我想你面临的情况和我相似。对于将事件与稍后生成的元素绑定,这是一个非常好的解决方案。

在通过其他事件生成的元素上绑定Jquery事件

最新更新