2

我在我的网站上工作,自从我学习 jQuery 以来,我的印象是 .live() 非常有用,但是最近,这里的许多人都被推荐使用 .on(),为什么这么?是什么让 .on() 优于 .live()?谢谢。

4

3 回答 3

7

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

于 2012-05-10T01:12:37.057 回答
1

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

延伸阅读

于 2012-05-10T01:15:47.353 回答
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的内部实现中,它们都调用了相同的函数,并且都具有相同的核心实现。

于 2012-05-10T01:26:24.487 回答