我一直认为.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事件