jQuery live方法有什么问题?

时间:2012-06-20 08:45:11

标签: jquery

jQuery 1.7中不推荐使用live()方法。 jQuery文档现在推荐

  

使用.on()附加事件处理程序。旧版jQuery的用户应优先使用.delegate() {。{1}}。

我理解.live()on是如何工作的,但我不明白为什么它们更好。 delegate更简单易用。

是否有理由拒绝live()?其他方法如何更好?如果我继续使用live会发生什么不好的事吗?

7 个答案:

答案 0 :(得分:33)

请参阅此处的一些解释:

  

http://www.ultimatewebtips.com/why-jquery-live-is-a-bad-option-to-use/ (网站似乎已关闭)

<强>引用:

  1. 您无法将.live()用于可重复使用的小部件。

  2. .stopPropagation()无法使用直播。

  3. .live()速度较慢。

  4. .live()不可链接。

  5. .on()的进一步之美在于它很好地简化了所有事件:http://api.jquery.com/on/

    呃呃,你知道api链接,看看.on()是如何工作的:)

    <强>引用:

      

    .on()方法将事件处理程序附加到当前选定的集合   jQuery对象中的元素。从jQuery 1.7开始,使用.on()方法   提供附加事件处理程序所需的所有功能。对于   帮助转换旧的jQuery事件方法,请参阅.bind(),   .delegate()和.live()。要删除与.on()绑定的事件,请参阅   .off()。附加仅运行一次然后删除的事件   本身,见.one()

答案 1 :(得分:10)

live()效率低下有两个原因:

  • 在构造$('selector').live()中,jQuery首先必须选择所有元素。但是,在调用live()时,它只需要jQuery对象的选择器(存储在.selector中)并且实际上不使用任何所选元素。因此,首先选择所有匹配元素然后不使用它们有点浪费。 on()delegate()将目标选择器作为参数,这意味着事先没有选择目标元素,只有在触发事件时才会进行测试。
  • 默认情况下,
  • live()绑定在document级别,因此所有事件都需要在整个DOM中冒泡。您可以通过使用$(selector, context).live()指定上下文来 缩小范围,但最好使用on()delegate()

在编写新代码时,强烈建议您使用最新且最好的on()而不是delegate()和已弃用的live()。但是,我认为live()的支持不会很快被删除(如果有的话),因为很多脚本都依赖它。此外,使用live()而不是on()并没有真正的缺点,因为jQuery源本身live()被定义为:

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}

答案 2 :(得分:4)

live方法存在两个主要问题:

  1. 它附加了文档级别的所有事件处理程序,因此任何冒泡到文档的事件都必须与所有实时事件的事件类型和选择器匹配。如果您有很多事件,页面将会缓慢。您应该使用delegateon来限制检查事件的范围。

  2. 该方法的使用并不典型,因为选择器与库中的其他方法一起使用。您只能在使用选择器创建的jQuery对象上使用它。当您为方法提供选择器时,delegateon方法会使其自然。

答案 3 :(得分:1)

我很确定这是由.live()的性质决定的。这很方便,但这是一种不好的做法,因为它会迫使您的浏览器在大多数情况下搜索更多需要的事件。

而不是默认搜索整个文档以查找特定事件,搜索特定容器的数据效率更高。

live()确实很方便使用,而且大多数操作系统从未注意到使用它的任何缺陷。在我看来,它基本上是一种改进的bind()

但在很多时候,我们必须适应并更清楚地了解需要执行的代码。

这就像问自己为什么要输入东西,为什么不是在开始时导入所有内容。

答案 4 :(得分:1)

live()将处理程序附加到文档,这基本上会导致拦截给定类型的所有事件,从而导致搜索与选择器匹配的元素的成本。使用delegate()on()时,建议您更靠近预期目标(如果可能的话,在他们的直接父级中),从而缩小处理事件的数量,并分别搜索匹配的目标。

答案 5 :(得分:1)

以下是有关live()性能和限制的详细article by Paul Irish

如果您继续使用live,如果您在项目中升级jQuery库,您的代码很快就会无法运行。

答案 6 :(得分:0)

$('some selector').live(' ... ', handler)

相同

$(document).on(' ... ', 'some selector', handler)

因此,当您使用live时,实际上将所有处理程序分配给DOM树的根目录。这有两个缺点:

  1. 将处理程序附加到DOM根目录会增加事件在buubling时遍历的路径。这会以不好的方式影响绩效。
  2. 最后使用return false的其他处理程序会阻止live处理程序被解雇的风险增加。