有没有理由在$ .delegate上使用$ .live?

时间:2010-09-16 18:17:29

标签: jquery events

我在另一个问题中读到,如果没有容器将事件附加到$ .delegate,你知道它不会消失,那么你可以使用直播,但为什么不这么做呢:

$('body').delegate('.myThing', 'click', function() { ... });

我已经相当确信没有理由在任何新代码中使用$.live(),并且它仍然仅用于向后兼容。

当然,我经常是错的。所以我问:我什么时候会使用$ .live而不是$ .delegate?为什么?

4 个答案:

答案 0 :(得分:7)

$.live()

如果您不需要为上下文使用特定元素,那么

...会更简洁。

$.delegate()

如果您已经选择了上下文,那么

...会更方便一些,特别是如果您正在链接以对该上下文执行其他操作。

如果您没有对目标元素执行任何其他操作,那么

...会稍微提高效率,因为它不会在绑定期间不必要地评估目标选择器。

...允许你定位多个上下文,live()不会(虽然见下面的实现说明)。

否则,这是个人偏好的问题。您可以使用这两种方法完成相同的事情 - 实际上,delegate的当前(从1.4.2开始)实现委托live

delegate: function( selector, types, data, fn ) {
        return this.live( types, data, fn, selector );
    }

实施说明

即使你可以有效地使用live()的当前实现来代替所有形式的delegate(),你应该避免以delegate()调用它的方式调用live() - 未记录的第四个参数仅供内部使用。通常,您可以通过将元素作为第二个参数传递给$()来为live()提供上下文给任何jQuery选择器的方式:

$(selector, contextElem).live(...);

如果您需要为上下文使用选择器(如在您希望将委托事件绑定到多个单独的上下文元素的场景中),您应该坚持使用delegate():

$("body>div").delegate(selector, ...);

示范

// all of these are the same - pick the shortest form that fits your needs:
$(document).delegate('.myThing', 'click', function() { ... });
$('.myThing', document).live('click', function() { ... });
$('.myThing').live('click', function() { ... });

// this should only be done using delegate
$("#myTable, #myDiv, #myMarquee").delegate('.myThing', 'click', function(){...});

答案 1 :(得分:6)

1.4.2中添加了.delegate()函数。我没有理由再使用.live()了。这只是打破旧习惯的问题。 .delegate()函数以不同且更有效的方式执行相同的操作。

以下是关于.delegate()的精彩文章:http://www.learningjquery.com/2010/03/using-delegate-and-undelegate-in-jquery-1-4-2

答案 2 :(得分:1)

$('.foo').live('click', fooClicked)$('#fooParent').delegate('#foo', 'click', fooClicked)更具可读性,您可以在onready处理程序之外调用它,以避免不必要地搜索DOM树。 (本文对该技术进行了很好的讨论:Don’t let jQuery’s $(document).ready() slow you down

答案 3 :(得分:0)

就像.live()一样,您也可以在就绪处理程序之外调用.delegate()