Jquery live()vs delegate()

Pee*_*Haa 102 jquery live

我在这里和其他地方的了解之间的差异在网络上一些帖子live()delegate().但是我没有找到我正在寻找的答案(如果这是一个骗局请告诉我).

我知道live和之间的区别delegatelive不能在链中使用.我也读过某些地方,delegate在某些情况下更快(更好的性能).

我的问题是,是否存在应该使用live而不是delegate

UPDATE

我已经设置了一个简单的测试来查看性能的差异.

我还添加了.on()jQuery 1.7+中提供的新功能

结果几乎总结了答案中所述的性能问题.

  • .live()除非您的jQuery版本不支持,否则请勿使用.delegate().
  • .delegate()除非您的jQuery版本不支持,否则请勿使用.on().

.live()和之间的差异.delegate()大于delegate()和之间的差异.on().

lon*_*day 147

我从不使用live; 我认为使用的好处delegate是如此巨大,以至于压倒性的.

一个好处live是它的语法非常接近于bind:

$('a.myClass').live('click', function() { ... });
Run Code Online (Sandbox Code Playgroud)

delegate但是,使用稍微冗长的语法:

$('#containerElement').delegate('a.myClass', 'click', function() { ... });
Run Code Online (Sandbox Code Playgroud)

然而,在我看来,这对于实际发生的事情要更加明确.您没有从live示例中发现实际上正在捕获事件document; 有delegate,很显然,事件捕捉发生在#containerElement.你可以做同样的事情live,但语法变得越来越可怕.

为要捕获的事件指定上下文也可以提高性能.通过该live示例,必须将整个文档的每次单击与选择器进行比较,a.myClass以查看它是否匹配.有delegate,那只是其中的元素#containerElement.这显然会提高性能.

最后,live要求您的浏览器查找a.myClass 当前是否存在. delegate仅在触发事件时查找元素,从而提供进一步的性能优势.


NB 在幕后delegate使用live,因此您可以使用您可以执行的任何live操作delegate.我的回答是关于它们,因为它们是常用的.

另请注意,在现代jQuery中执行事件委派的最佳方式既不是live也不delegate是.新的语法(从jQuery 1.7开始)与该on函数一起使用.语法如下:

$('#containerElement').on('click', 'a.myClass', function() { ... });
Run Code Online (Sandbox Code Playgroud)

  • +1.在`live()`中重用前面的选择器令人困惑,导致用户误解它实际上在做什么.`delegate()`更清楚.另外,虽然`delegate()`是(目前)使用`live()`实现的,但它使用的是没有记录的`live()`的四参数版本,所以大概只供内部使用.我个人总是避免`live()`,除非我出于某种原因需要运行jQuery 1.3(希望不是). (4认同)
  • @all:来自jQuery文档:`从jQuery 1.4开始,直播事件可以绑定到DOM元素"上下文"而不是默认文档根目录.自从我们现在使用时,不会'live()`更好用可以添加事件上下文.因为`delegate()`在内部调用`live()`.所以我认为1号呼叫较少.还是我错了? (4认同)

use*_*716 24

它们完全相同,除了:

  • .delegate()允许您缩小页面的本地部分,同时.live()必须处理整个页面中的事件.
  • .live() 从浪费的DOM选择开始

当你打电话时.delegate(),它只是转身并调用.live(),但传递额外的上下文参数.

https://github.com/jquery/jquery/blob/master/src/event.js#L948-950

因此,我总是使用.delegate().如果您确实需要它来处理页面上的所有事件,那么只需将其body作为上下文.

$(document.body).delegate('.someClass', 'click', function() {
    // run handler
});
Run Code Online (Sandbox Code Playgroud)

旧版本的jQuery实际上具有delegate功能.您只需要在调用时将选择器或元素作为上下文属性传递.live().当然,它需要加载到页面上.

$('.someClass', '#someContainer').live('click',function() {
    // run handler
});
Run Code Online (Sandbox Code Playgroud)

而你的行为与...相同.delegate().

  • 我不知道为什么这个答案没有更多的选票.`.delegate()`使用`.live()`.在性能方面,`.delegate()`明显优于`.live()`:http://stackoverflow.com/questions/2690370/live-vs-bind/7692651#7692651 (3认同)