是什么让.on()与.live()相比更有效率?

时间:2012-05-10 01:08:55

标签: jquery

我正在我的网站上工作,从我学习jQuery的时候开始,我觉得.live()非常有帮助,但是最近,很多人都建议你使用.on() , 为什么会这样?是什么让.on()优于.live()?感谢。

3 个答案:

答案 0 :(得分:7)

.live()使用该文档作为委派事件的容器。现在由.delegate()取代的.on(),允许您选择要委托的容器。通过选择树中较低的容器,可以减少必须测试的冒泡事件的数量,以确定它们是否符合委派处理的标准。

答案 1 :(得分:1)

使用.live是不好的,因为将所有.live事件处理程序放在文档对象上是不好的。事情真的可以放慢速度。事件不仅要一直冒泡到文档,而且可能有很多事件处理程序可以查看文档对象。 .on()的主要优点是可以将它附加到更接近实际对象的父对象,并大大提高性能。

Further Reading

答案 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的内部实现中,它们都调用相同的函数,并且都具有相同的核心实现。