为什么使用jQuery';s";关于;“比”好;“生活”;
我看到越来越多的开发人员正在使用为什么使用jQuery';s";关于;“比”好;“生活”;,jquery,Jquery,我看到越来越多的开发人员正在使用$('#element id').on()方法,而不是$('#element id').live()方法 为什么??live方法没有的是什么?与绑定的事件处理程序。live与文档绑定。与.on绑定的事件处理程序绑定到您指定的元素。这意味着您可以减少事件冒泡到将接收它的元素所花费的时间,也意味着您可以停止传播(使用.live不可能,因为它已经到达文档) .on方法还允许对所有事件处理程序使用单个方法-。live将始终委托事件处理程序,而.on仅在将选择器作为第二个参
$('#element id').on()
方法,而不是$('#element id').live()
方法
为什么??
live
方法没有的是什么?与绑定的事件处理程序。live
与文档绑定。与.on
绑定的事件处理程序绑定到您指定的元素。这意味着您可以减少事件冒泡到将接收它的元素所花费的时间,也意味着您可以停止传播(使用.live
不可能,因为它已经到达文档)
.on
方法还允许对所有事件处理程序使用单个方法-。live
将始终委托事件处理程序,而.on
仅在将选择器作为第二个参数传递时才会委托。如果没有,它将绑定到匹配的元素集
以下列表中列出了更多缺点:
- jQuery尝试检索选择器指定的元素
调用
.live()
方法之前,这可能会在
大型文件
- 不支持链接方法。例如
$(“a”).find(“.offsite,.external”).live(…)代码>无效,不可用
没有按预期工作
- 由于所有
.live()
事件都附加在
文档元素,事件采用最长和最慢的可能路径
在他们被处理之前
- 在移动iOS(iPhone、iPad和iPod Touch)上,对于大多数元素,单击事件不会出现在文档正文中,并且不能与
.live()
- 在事件处理程序中调用
event.stopPropagation()
,在停止文档中较低的事件处理程序时无效;事件已传播到文档
.live()
方法以令人惊讶的方式与其他事件方法交互,例如$(文档)。取消绑定(“单击”)
将删除通过调用.live()
附加的所有单击处理程序
出于所有这些原因,您应该始终使用.on()
而不是.live()
。如果您仍然使用旧版本的jQuery(低于1.7),那么可以使用.delegate()
旁注-所有事件绑定方法都在引擎盖下调用.on()
,因此使用.on()
满足所有事件处理需求是有意义的。不要费心于像这样的快捷方式。单击()
;您可以从中看到,他们所做的只是在
上调用:
return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
完整答案:
简短阅读:
不再推荐使用.live()方法,因为较新版本的jQuery提供了更好的方法,但没有缺点。特别是,使用.live()时会出现以下问题:
- jQuery尝试在调用.live()方法之前检索选择器指定的元素,这在大型文档中可能会很耗时
- 不支持链接方法。例如,$(“a”).find(“.offsite,.external”).live(…);无效,无法按预期工作
- 由于所有.live()事件都附加在document元素上,因此在处理事件之前,事件的路径可能最长、最慢
- 在事件处理程序中调用event.stopPropagation()无法停止文档中较低位置附加的事件处理程序;事件已传播到文档
- .live()方法与其他事件方法的交互方式可能会令人惊讶,例如$(document)。取消绑定(“单击”)将删除任何调用.live()所附加的所有单击处理程序李>
另外,请记住,.on()函数只包含在jQuery 1.7中,它在早期版本中不起作用。首先,从jQuery 1.7开始,不推荐使用live()
方法,您应该开始逐步停止在代码中使用它。使用此方法无法正确支持链接
关于jQuery.bind(),.live(),.delegate(),.on()之间的比较,有一篇非常好的文章