jquery live()vs delegate()

我在这里和网上的其他地方阅读了一些关于live()delegate()之间差异的文章。 但是,我还没有找到我正在寻找的答案(如果这是一个骗局,请告诉我)。

我知道livedelegate之间的区别在于live不能在连锁中使用。 我还在某处读了一些delegate在某些情况下更快(更好的性能)。

我的问题是,有没有一种情况,你应该使用live而不是delegate

UPDATE

我已经设置了一个简单的测试,以查看性能的差异。

我还添加了新的.on() ,它在jQuery 1.7+中可用

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

  • 除非你的jQuery版本不支持.delegate()否则不要使用.live() .delegate()
  • 除非你的jQuery版本不支持.on()否则不要使用.on()

.live().delegate()之间的区别比delegate().on()之间的.on()

我从来不用live ; 我认为使用delegate的好处是如此重大,以至于压倒一切。

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

 $('a.myClass').live('click', function() { ... }); 

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

 $('#containerElement').delegate('a.myClass', 'click', function() { ... }); 

然而,这似乎更明确地说明了实际发生的事情。 你从live例子中没有意识到这些事件实际上是在document上被捕获的; 与delegate ,很显然事件捕获发生在#containerElementlive可以做同样的事情,但是语法变得越来越可怕。

指定要捕获的事件的上下文也会提高性能。 通过live实例,每一次点击整个文档都必须与选择器a.myClass进行比较,看它是否匹配。 使用delegate ,这只是#containerElement的元素。 这显然会提高性能。

最后, live需要您的浏览器查找a.myClass 不管它是否存在delegate只在事件触发时查找元素,从而提供进一步的性能优势。


NB delegate使用live幕后,所以你可以做任何事情,你可以做与delegate 。 我的回答是通常使用的。

还要注意,在现代jQuery中, livedelegate都不是做事件delegate的最好方法。 新的语法(截至jQuery 1.7)与on函数。 语法如下:

 $('#containerElement').on('click', 'a.myClass', function() { ... }); 

他们是完全一样的,除了:

  • .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 }); 

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

 $('.someClass', '#someContainer').live('click',function() { // run handler }); 

你有和.delegate()一样的行为。

想到两种情况:

  1. 你将在body元素上使用delegate ,所以你可以直接使用live因为它更简单。

  2. 您需要使用旧版本的jQuery库,其中delegate事件尚未实现。

考虑这个例子

 <ul id="items"> <li> Click Me </li> </ul> $('#items').delegate('li', 'click', function() { $(this).parent().append('<li>New Element</li>'); }); 

通过传递一个DOM元素作为我们的选择器的上下文,我们可以使Live()的行为(几乎)与delegate()所做的相同。 它将处理程序附加到上下文,而不是文档 – 这是默认的上下文。 下面的代码等同于上面显示的delegate()版本。

 $("li", $("#items")[0]).live("click", function() { $(this).parent().append("<li>New Element</li>"); }); 

资源

但是,您最好使用委托来获得更好的性能, 请参阅此处