jquery live()vs delegate()
我在这里和网上的其他地方阅读了一些关于live()
和delegate()
之间差异的文章。 但是,我还没有找到我正在寻找的答案(如果这是一个骗局,请告诉我)。
我知道live
和delegate
之间的区别在于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
,很显然事件捕获发生在#containerElement
。 live
可以做同样的事情,但是语法变得越来越可怕。
指定要捕获的事件的上下文也会提高性能。 通过live
实例,每一次点击整个文档都必须与选择器a.myClass
进行比较,看它是否匹配。 使用delegate
,这只是#containerElement
的元素。 这显然会提高性能。
最后, live
需要您的浏览器查找a.myClass
不管它是否存在 。 delegate
只在事件触发时查找元素,从而提供进一步的性能优势。
NB delegate
使用live
幕后,所以你可以做任何事情,你可以做与delegate
。 我的回答是通常使用的。
还要注意,在现代jQuery中, live
和delegate
都不是做事件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()
一样的行为。
想到两种情况:
-
你将在
body
元素上使用delegate
,所以你可以直接使用live
因为它更简单。 -
您需要使用旧版本的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>"); });
资源
但是,您最好使用委托来获得更好的性能, 请参阅此处