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>"); });
资源
但是,您最好使用委托来获得更好的性能, 请参阅此处