Memory management jQuery.live()是否更占用内存?

Memory management jQuery.live()是否更占用内存?,memory-management,jquery,Memory Management,Jquery,jQuery.live()是否比简单的.click().hover()或.keyup()更占用内存 我想是的,但是到了什么程度?我猜它的内存占用更少,但处理器占用更多,因为它只为每个事件/选择器分配一个处理函数,但它需要对页面上发生的每一个此类事件对该选择器进行匹配测试,以查看它是否匹配 事实上,尽管我还没有深入研究它是如何工作的,但我认为它需要对从e.target到document(或直到找到匹配项)的每个元素的选择器运行匹配测试,以查看是否有任何匹配项。如果我错了,其他人可以纠正我 也就是说

jQuery.live()是否比简单的.click().hover()或.keyup()更占用内存


我想是的,但是到了什么程度?

我猜它的内存占用更少,但处理器占用更多,因为它只为每个事件/选择器分配一个处理函数,但它需要对页面上发生的每一个此类事件对该选择器进行匹配测试,以查看它是否匹配

事实上,尽管我还没有深入研究它是如何工作的,但我认为它需要对从
e.target
document
(或直到找到匹配项)的每个元素的选择器运行匹配测试,以查看是否有任何匹配项。如果我错了,其他人可以纠正我

也就是说,当您执行
$('.someClass')。单击(function(){})
时,它也只使用一个处理程序函数。因此,如果有100个元素具有
.someClass
,它们将共享相同的函数,但是jQuery确实需要在
jQuery.cache
中为获取该处理程序的每个元素创建一个唯一的条目,因此需要像单独管理它们一样对它们进行管理

.delegate()
方法是两者之间的一个很好的折衷

它的行为与
.live()
相同,只是您将其分配给页面的本地部分,因此它只处理该部分中的单击。因此,不需要考虑在页面上发生的每一个事件。而只是那些发生在容器内的事件



编辑:改进了选择器引擎正在执行的操作,这要归功于。

这取决于您试图完成的操作。我遇到的几乎每一个使用
live()
的案例最终都能通过
delegate()
得到更好的解决。(它们相似,但有一个关键区别)
live()
委托给整个DOM树的根,并检查您指定的每个事件。使用
delegate()
可以指定一个不同的根目录来监视事件,结果执行效率更高。

@Josiah:我打字的速度比我阅读或思考的速度快,这有时会给我带来麻烦;o) @patrick Yea,这可能就是它的工作原理。对于激发的每个事件,对于
e.target
document
之间的每个元素,如果元素匹配其中一个“活动”选择器,并且事件类型也匹配,则运行关联的处理程序。注意:短语“运行选择器”意味着搜索与选择器匹配的元素(如
$(选择器)
)。在本例中,我们将元素与选择器进行匹配(如
$(element).is(selector)
).+1-关于
.live
事件一直冒泡到文档,您是对的。记住,你不能在
.live
处理程序上执行
e.stopPropagation
,但你可以在
处理程序上执行
委派
操作。@karim79:是的,它肯定依赖于冒泡。我最近考虑的唯一一件事是,它需要针对从
e.target
document
的路径中的每个项目的选择器进行测试。我以前认为
.live()
是每个事件运行一次选择器,但我认为不是这样。@Šime Vidas:你说得对。它的措辞与“与选择器匹配”的措辞相同。我认为值得更新一下。谢谢o)