30

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

用于.on()附加事件处理程序。旧版本 jQuery 的用户应该.delegate()优先使用.live().

我了解如何ondelegate工作,但我不明白为什么它们更好。live()更简单,更易于使用。

live是否有被弃用的原因?其他方法如何更好?如果我继续使用会不会有什么不好的事情发生live

4

7 回答 7

33

请参阅此处的一些解释:

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

引用:

  1. 您不能.live()用于可重复使用的小部件。

  2. .stopPropagation()不适用于直播。

  3. .live()速度较慢。

  4. .live()不可链接。

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

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

引用:

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

于 2012-06-20T08:49:23.363 回答
10

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

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

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

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}
于 2012-06-20T08:54:37.213 回答
4

该方法有两个主要问题live

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

  2. 对于选择器如何与库中的其他方法一起使用,该方法的使用并不典型。您只能在使用选择器创建的 jQuery 对象上使用它。当您向方法提供选择器时, delegateandon方法使这很自然。

于 2012-06-20T08:59:22.577 回答
1

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

默认情况下,不是在整个文档中搜索某个事件,而是搜索特定容器的数据效率更高。

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

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

这就像问自己为什么必须导入东西,为什么不是在开始时导入所有东西。

于 2012-06-20T08:47:32.383 回答
1

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

于 2012-06-20T08:49:30.850 回答
1

这是Paul Irish关于 live() 性能和限制的详细文章。

如果您继续使用live,如果您升级项目中的 jQuery 库,您的代码迟早将无法工作。

于 2012-06-20T08:50:02.207 回答
0

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

是相同的

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

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

  1. 将处理程序附加到 DOM 根会增加事件在冒泡时必须遍历的路径。这将以不好的方式影响性能。
  2. 最后的其他处理程序return false会阻止live处理程序触发的风险增加。
于 2012-06-20T08:51:03.620 回答