0

有没有办法使用 jQuery 委托事件,该事件将对应于页面上与选择器匹配的所有元素,而不是委托 from $(document)

由于这可能措辞不佳,因此问题如下:

过去jQuery.live,所有与选择器匹配的元素都有委托事件。这被jQuery.delegate哪个将特定上下文选择器中的事件委托给其子级所取代,而后者又被 取代jQuery.on,后者实际上做同样的事情,但在幕后有不同的位(我想)。

我想要做的是安全地为div.foo我页面上的每个页面添加一个事件处理程序,无论它可能存在于何处或何时存在。根据文档和实证研究,以下内容只会绑定到.foo脚本运行时存在的元素。由于.foo稍后可能会在页面上放置元素的代码,因此这并不完全有效。

jQuery('.foo').on('click', handler);

由于live已弃用(可能已删除?),我试图不使用它,但我能想出的唯一解决方案是

jQuery(document).on('click', '.foo', handler);

但这不是live最初在幕后所做的吗?更重要的是,有什么重要的理由这样做吗?

我们专门使用版本 1.7.2,但通用 jQuery 答案也会有所帮助。

4

2 回答 2

1

您是正确的,对文档的绑定(如下所示)正是这样live()做的:

jQuery(document).on('click', '.foo', handler);

这不好的原因是它的性能不是很好。每次您在任何地方单击时,都会document检查它是否在委托元素上。

更好的方法是使用一个元素来代替与document动态附加的元素最近的父元素,但该元素在页面加载时可用。即使这是一个顶级容器,与将所有内容附加到document.

于 2013-01-14T16:28:34.277 回答
1

事件从它们的源冒泡到它们被委派的任何东西,所以你应该在最低公共父级的任何级别使用 jquery().on。如果那是文件,那就这样吧。

否则,如果您的.foo项目总是在一个.foocontainer(或某物)内创建,那么您可以在选择器中使用它,即使其中有多个 - 您最终只是附加。

我认为委派回文档的问题在于它可能需要事件冒泡很多次,在此过程中会产生额外的开销,因此最好将事件委派到尽可能靠近源的位置。

于 2013-01-14T16:28:47.447 回答