我在另一个问题中读到,如果没有容器将事件附加到$ .delegate,你知道它不会消失,那么你可以使用直播,但为什么不这么做呢:
$('body').delegate('.myThing', 'click', function() { ... });
我已经相当确信没有理由在任何新代码中使用$.live()
,并且它仍然仅用于向后兼容。
当然,我经常是错的。所以我问:我什么时候会使用$ .live而不是$ .delegate?为什么?
答案 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()