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

Wil*_*ill 8 jquery events

我在另一个问题中读到,如果没有容器将事件附加到您知道不会消失的$ .delegate,那么您将使用直播,但为什么不简单地执行:

$('body').delegate('.myThing', 'click', function() { ... });
Run Code Online (Sandbox Code Playgroud)

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

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

Sho*_*og9 7

$.live()

...如果您不需要为上下文使用特定元素,则会更简洁一些.

$.delegate()

如果您已经选择了上下文,则稍微方便一些,特别是如果您正在链接以在该上下文上执行其他操作.

...如果您没有对目标元素执行任何其他操作,则会稍微提高效率,因为它不会在绑定期间不必要地评估目标选择器.

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

否则,这是个人喜好的问题.你可以完成同样的事情,这两种方法-事实上,目前(截至1.4.2)实现的delegate仅仅是代表live!

delegate: function( selector, types, data, fn ) {
        return this.live( types, data, fn, selector );
    }
Run Code Online (Sandbox Code Playgroud)

实施说明

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

$(selector, contextElem).live(...);
Run Code Online (Sandbox Code Playgroud)

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

$("body>div").delegate(selector, ...);
Run Code Online (Sandbox Code Playgroud)

示范

// 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(){...});
Run Code Online (Sandbox Code Playgroud)


Lan*_*her 6

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

这是一篇关于.delegate()的好文章:http://www.learningjquery.com/2010/03/using-delegate-and-undelegate-in-jquery-1-4-2