2013-01-14 55 views
0

有没有什么办法可以使用jQuery来委托一个事件,它将对应于页面上与选择器匹配的所有元素,而不是从$(document)中委托?1.7.2中的jQuery事件委托

因为这可能是措辞不当,这里的难题是:

曾经有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答案也会有所帮助。

+0

这是'live'最初做的,但它也正是你要找的。理想情况下,你会使用'document'以外的其他东西,但是如果你不能缩小它,那么'document'是你唯一的选择。 –

+0

@詹姆斯蒙塔涅耶我怀疑这一点。我只是不知道是否有理由不把它委托给文档,除了可能阻止'stopPropagation'。 –

+1

也表现。它必须一直冒泡,页面上的每次点击都会被捕获并检查,看看它是否是正确的选择器。 –

回答

1

事件从源头冒泡到他们委派的任何东西,所以您应该在最常见的父级上使用jquery()。如果这是文件,那就这样吧。如果你的.foo项目总是在.foocontainer(或其他)中创建,那么你可以在你的选择器中使用它,即使它们中有多个 - 你只需要连接。

我认为委托回文档的问题是它可能需要事件冒泡很多次,在流程中产生额外的开销,所以最好尽可能将事件委托给源代码。

1

你处于一个结合到文件(如下)正确正是live()做:

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

其原因,这是不好的,因为它不是非常高性能的。每当您单击任何地方时,document都会检查它是否位于委托元素上。

更好的方法是使用元素代替document,这是最接近动态追加的元素的父元素,但可在页面加载时使用。即使这是顶级容器,它仍然会提供性能优势,而不是将所有内容都附加到document