我已在此处和网络上的其他位置阅读了有关live()
和delegate()
之间差异的一些帖子。但是我没有找到我正在寻找的答案(如果这是一个骗局请告诉我)。
我知道live
和delegate
之间的区别在于live
不能在链中使用。我还在某处读过delegate
在某些情况下更快(性能更好)。
我的问题是,您是否应该使用live
代替delegate
?
更新
我已设置simple test以查看效果差异。
我还添加了jQuery 1.7 +
中提供的新.on()
结果几乎总结了答案中所述的性能问题。
.live()
,否则请勿使用.delegate()
。 .delegate()
。.on()
.live()
和.delegate()
之间的差异比delegate()
和.on()
之间的差异大。
答案 0 :(得分:147)
我从不使用live
;我认为使用delegate
是如此充实以至于压倒性的好处。
live
的一个好处是它的语法非常接近bind
的语法:
$('a.myClass').live('click', function() { ... });
但是, delegate
使用稍微冗长的语法:
$('#containerElement').delegate('a.myClass', 'click', function() { ... });
然而,在我看来,这对于实际发生的事情要更加明确。您没有从live
示例中意识到事件实际上是在document
上捕获的;使用delegate
,很明显事件捕获发生在#containerElement
上。你可以用live
做同样的事情,但语法变得越来越可怕。
指定要捕获的事件的上下文也可以提高性能。使用live
示例,必须将整个文档的每次单击与选择器a.myClass
进行比较,以查看它是否匹配。使用delegate
,这只是#containerElement
中的元素。这显然会提高性能。
最后,live
要求您的浏览器查找a.myClass
当前是否存在。 delegate
仅在触发事件时查找元素,从而进一步提升性能。
NB delegate
在幕后使用live
,因此您可以使用live
对delegate
执行任何操作。我的回答是关于它们,因为它们是常用的。
另请注意,live
和delegate
都不是现代jQuery中进行事件委托的最佳方式。新语法(从jQuery 1.7开始)使用on
函数。语法如下:
$('#containerElement').on('click', 'a.myClass', function() { ... });
答案 1 :(得分: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
});
旧版本的jQuery实际上具有 delegate
功能。您只需在调用.live()
时将选择器或元素作为上下文属性传递。当然,它需要加载到页面上。
$('.someClass', '#someContainer').live('click',function() {
// run handler
});
您的行为与 .delegate()
相同。
答案 2 :(得分:3)
有两种情况浮现在脑海中:
您将在delegate
元素上使用body
,因此您可以使用live
代替它,因为它更简单。
您需要使用旧版本的jQuery库,其中delegate
事件尚未实现。
答案 3 :(得分:2)
考虑这个例子
<ul id="items">
<li> Click Me </li>
</ul>
$('#items').delegate('li', 'click', function() {
$(this).parent().append('<li>New Element</li>');
});
通过传递DOM元素作为我们的选择器的上下文,我们可以使Live()的行为(几乎)与委托()的行为相同。它将处理程序附加到上下文,而不是文档 - 这是默认上下文。下面的代码等同于上面显示的delegate()版本。
$("li", $("#items")[0]).live("click", function() {
$(this).parent().append("<li>New Element</li>");
});
但是,您最好使用委托来获得更好的效果see here