我在另一个问题中读到,如果没有容器将事件附加到你知道不会消失的$.delegate,你会使用直播,但为什么不简单地做:
$('body').delegate('.myThing','click',function() { ... });
我已经相当确信没有理由在任何新代码中使用$.live()并且它仍然仅用于向后兼容.
当然,我经常是错的.所以我问:我什么时候会使用$.live而不是$.delegate?为什么?
解决方法
$.live()
…如果您不需要为上下文使用特定元素,则会更简洁一些.
$.delegate()
如果您已经选择了上下文,则稍微方便一些,特别是如果您正在链接以在该上下文上执行其他操作.
…如果您没有对目标元素执行任何其他操作,则会稍微提高效率,因为它不会在绑定期间不必要地评估目标选择器.
…允许你定位多个上下文,live()不会(虽然见下面的实现说明).
否则,这是个人偏好的问题.您可以使用这两种方法完成相同的事情 – 事实上,当前(从1.4.2开始)委托的实现仅仅代表生活!
delegate: function( selector,types,data,fn ) { return this.live( types,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',function() { ... }); $('.myThing',document).live('click',function() { ... }); $('.myThing').live('click',function() { ... }); // this should only be done using delegate $("#myTable,#myDiv,#myMarquee").delegate('.myThing',function(){...});