我在另一个问题中读到,如果没有容器可以使用$.delegate附加事件,而你知道这个容器不会消失,那么你会使用live,但为什么不直接这样做:
$('body').delegate('.myThing', 'click', function() { ... });
我相信在任何新代码中都没有使用$.live()
的理由,它只是为了向后兼容而存在。
当然,我经常会犯错。所以我想问:什么情况下我会使用$.live而不是$.delegate,为什么?
$.live()
如果您不需要为上下文使用特定的元素,则稍微简洁一些。
$.delegate()
如果您已经选择了上下文,特别是如果您正在链接以在该上下文中执行其他操作,则会更加方便。
如果您没有在目标元素上执行任何其他操作,则稍微更有效率,因为它不会在绑定期间不必要地评估目标选择器。
允许您针对多个上下文进行目标,而live()则不行(请参见下面的实现说明)。
否则,这只是个人喜好问题。您可以使用两种方法都实现相同的功能 - 实际上,当前(截至1.4.2)delegate
的实现只是委托给live
!
delegate: function( selector, types, data, fn ) {
return this.live( types, data, fn, selector );
}
尽管您可以有效地使用当前的live()实现作为delegate()的所有形式的替代,但是您应该避免以delegate()调用它的方式调用live() - 未记录的第四个参数仅供内部使用。通常,您会像向任何jQuery选择器提供上下文一样,通过将元素作为第二个参数传递给$()来为live()提供上下文:
$(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(){...});
.delegate()函数是在1.4.2版本中添加的,我再也没有理由使用.live()了。这只是一个打破旧习惯的问题。.delegate()函数以不同且更高效的方式完成相同的工作。
这里有一篇关于.delegate()的优秀文章:http://www.learningjquery.com/2010/03/using-delegate-and-undelegate-in-jquery-1-4-2
$('.foo').live('click', fooClicked)
比 $('#fooParent').delegate('#foo', 'click', fooClicked)
更易读,并且您可以在 onready 处理程序之外调用它,以避免不必要地搜索 DOM 树。 (本文对该技术进行了很好的讨论:不要让 jQuery 的 $(document).ready() 减慢您的速度)
就像.live()
一样,你也可以在ready处理程序之外调用.delegate()
delegate
不需要先评估选择器,在初始化期间可以节省时间。 - Shog9