$ .live和$ .delegate之间是否有任何使用原因?

8

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

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

我相信在任何新代码中都没有使用$.live()的理由,它只是为了向后兼容而存在。

当然,我经常会犯错。所以我想问:什么情况下我会使用$.live而不是$.delegate,为什么?

4个回答

7

$.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(){...});

很好的答案,加一分是因为包含了一些 jQuery 的源代码! - Lance Fisher
委托(delegate)比现场(live())更快吗?谢谢 - Mike
1
@Mike:这是有可能的。它是否会发生,或者差异是否明显,取决于具体情况。delegate不需要先评估选择器,在初始化期间可以节省时间。 - Shog9

6

我再也没有理由使用.live()了,这听起来非常令人不安!:P - Pekka

1

$('.foo').live('click', fooClicked)$('#fooParent').delegate('#foo', 'click', fooClicked) 更易读,并且您可以在 onready 处理程序之外调用它,以避免不必要地搜索 DOM 树。 (本文对该技术进行了很好的讨论:不要让 jQuery 的 $(document).ready() 减慢您的速度


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接