我发现现在有更多的开发人员正在使用$('#element-id').on()
方法而不是$('#element-id').live()
方法。
为什么呢? live
方法没有的是什么?
答案 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():
会出现以下问题另外,请记住.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