我在我的网站上工作,自从我学习 jQuery 以来,我的印象是 .live() 非常有用,但是最近,这里的许多人都被推荐使用 .on(),为什么这么?是什么让 .on() 优于 .live()?谢谢。
3 回答
.live()
使用文档作为事件委托的容器。.delegate()
,现在被取代,.on(),
允许您选择要委托给的容器。通过选择树中较低的容器,您可以减少冒泡事件的数量,这些冒泡事件必须进行测试以查看它们是否符合委托处理的标准。
使用.live
是不好的,因为将所有.live
事件处理程序放在文档对象上是不好的。事情可以真的,真的慢下来。不仅事件必须一直冒泡到文档,而且您可能有很多事件处理程序要查看文档对象。的主要优点.on()
是您可以将其附加到更接近实际对象的父对象并大大提高性能。
有几个问题.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的内部实现中,它们都调用了相同的函数,并且都具有相同的核心实现。