我正在我的网站上工作,从我学习jQuery的时候开始,我觉得.live()非常有帮助,但是最近,很多人都建议你使用.on() , 为什么会这样?是什么让.on()优于.live()?感谢。
答案 0 :(得分:7)
.live()
使用该文档作为委派事件的容器。现在由.delegate()
取代的.on(),
允许您选择要委托的容器。通过选择树中较低的容器,可以减少必须测试的冒泡事件的数量,以确定它们是否符合委派处理的标准。
答案 1 :(得分:1)
使用.live
是不好的,因为将所有.live
事件处理程序放在文档对象上是不好的。事情真的可以放慢速度。事件不仅要一直冒泡到文档,而且可能有很多事件处理程序可以查看文档对象。 .on()
的主要优点是可以将它附加到更接近实际对象的父对象,并大大提高性能。
答案 2 :(得分:1)
.live()
有几个问题:
首先,您使用.live()
的语法:
$(".whatever").live("click", fn);
是浪费的,因为它会立即评估$(".whatever")
,但实际上并没有对初始评估做任何事情。
第二关,.live()
不灵活,并将所有委派的事件处理程序附加到document
对象。事实上,这两行代码基本上是相同的:
$(".whatever").live("click", fn);
$(document).on("click", ".whatever", fn);
将所有委托事件处理程序附加到文档对象的问题是,每次事件冒泡到文档时,都必须将它与每个.live()事件处理程序进行比较,并且某些比较运行起来不便宜因为它们是选择器操作。如果您有很多.live()
事件处理程序和/或评估选择器的速度很慢,那么事件处理可能会陷入困境。
但是,使用.on()
,您可以选择一个更接近您正在处理事件的动态对象的静态父对象。这会将事件处理程序列表分解为更小的列表,并且只需要检查较小的列表以查找更少数量的事件。所以,而不是这些大致相同的代码行:
$(".whatever").live("click", fn);
$(document).on("click", ".whatever", fn);
您可以使用.on()
$("immediate parent selector").on("click", ".whatever", fn);
将实际的委托事件处理程序附加到动态对象的关闭祖先,使事件处理更加高效。事件不仅不需要一直冒泡到文档对象,而且每个事件发生时都有一个小得多的选择器/对象列表。
您可能需要注意.on()
与.delegate()
基本相同。唯一的区别在于参数的顺序。事实上,在jQuery的内部实现中,它们都调用相同的函数,并且都具有相同的核心实现。