为什么jQuery的“on”比“live”更好

时间:2012-09-04 12:22:50

标签: jquery

我发现现在有更多的开发人员正在使用$('#element-id').on()方法而不是$('#element-id').live()方法。

为什么呢? live方法没有的是什么?

3 个答案:

答案 0 :(得分:7)

.live绑定的事件处理程序绑定到document。绑定到.on的事件处理程序绑定到您指定的元素。这意味着您可以减少事件冒泡到将接收它的元素所花费的时间,这也意味着您可以停止传播(.live不可能,因为它已经到达文档)。

.on方法还允许您对所有事件处理程序使用单个方法 - .live将始终委托事件处理程序,而.on仅在您将选择器作为传递方式时委派第二个论点。没有一个,它将绑定到匹配的元素集。

jQuery docs中列出了更多缺点:

  
      
  • jQuery尝试检索选择器指定的元素   在调用.live()方法之前,这可能很耗时   大文件。

  •   
  • 不支持链接方法。例如,   $("a").find(".offsite, .external").live( ... );无效且无效   不按预期工作。

  •   
  • 由于所有.live()事件都附加在   文档元素,事件采用最长和最慢的路径   在处理之前。

  •   
  • 在移动iOS(iPhone,iPad和iPod Touch)上,对于大多数元素,点击事件不会冒泡到文档正文,也不能与.live() ...

      
  • 在事件处理程序中调用event.stopPropagation()对于停止附加在文档中较低位置的事件处理程序是无效的;该事件已经传播到文件。

  •   
  • .live()方法以令人惊讶的方式与其他事件方法交互,例如,$(document).unbind("click")删除通过对.live()的任何调用附加的所有点击处理程序!

  •   

由于所有这些原因,您应始终使用.on()而不是.live()。如果您坚持使用旧版本的jQuery(低于1.7),则可以使用.delegate()代替。


旁注 - 所有事件绑定方法都会调用.on(),因此使用.on()来满足您的所有事件处理需求是有意义的。不要打扰像.click()这样的快捷方式;你可以从1.7.2 source看到他们所做的只是致电.on

return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);

答案 1 :(得分:0)

完整答案:http://www.jquery4u.com/jquery-functions/on-vs-live-review/#.UEXy7NZSskU

简短阅读:

不再推荐使用.live()方法,因为更高版本的jQuery提供了更好的方法,没有它的缺点。特别是,使用.live():

会出现以下问题
  • jQuery尝试在调用.live()方法之前检索选择器指定的元素,这在大型文档上可能很耗时。
  • 不支持链接方法。例如,$(“a”)。find(“。offsite,.external”)。live(...);无效,无法按预期工作。
  • 由于所有.live()事件都附加在文档元素上,因此事件在处理之前会占用最长和最慢的路径。
  • 在事件处理程序中调用event.stopPropagation()对于停止附加在文档中较低位置的事件处理程序是无效的;该事件已经传播到文件。
  • .live()方法以令人惊讶的方式与其他事件方法交互,例如,$(document).unbind(“click”)删除通过对.live()的任何调用附加的所有点击处理程序!

另外,请记住.on()函数仅包含在jQuery 1.7中,它不适用于早期版本。

答案 2 :(得分:0)

从jQuery 1.7开始,首先不推荐使用live()方法,你应该开始逐步淘汰它在代码中的使用。使用这种方法不能正确支持连接。

jQuery .bind() , .live() , .delegate() , .on()

之间的比较有一篇非常好的文章

http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html