Jquery 什么';.delegate()和live()之间的区别是什么?
自 相当于使用.live()编写的以下代码: 根据 我打赌我错了,但这和写作不一样吗Jquery 什么';.delegate()和live()之间的区别是什么?,jquery,events,delegates,Jquery,Events,Delegates,自 相当于使用.live()编写的以下代码: 根据 我打赌我错了,但这和写作不一样吗 $("table").each(function(){ $("td", this).live("hover", function(){ $(this).toggleClass("hover"); }); }); 那么,什么是.delegate()呢?监听文档,其中as监听一个更本地的元素,在这种情况下, 它们在侦听冒泡事件时的行为相同,而.delegate()中的事件在被捕获之
$("table").each(function(){
$("td", this).live("hover", function(){
$(this).toggleClass("hover");
});
});
那么,什么是.delegate()
呢?监听文档
,其中as监听一个更本地的元素,在这种情况下,
它们在侦听冒泡事件时的行为相同,而.delegate()
中的事件在被捕获之前冒泡较少
你的例子是:
$("table td").live('hover', function() {});
与此不同,因为它再次将事件处理程序附加到文档而不是
,因此对于更多的本地元素也是如此,在大多数方面都更有效……尽管它仍然在幕后使用
还请记住,$(选择器)
检索元素,因此$(“表td”)
在使用.live()
时选择了一组元素,而as$(“表”).delegate()
仅选择
元素,因此,即使最初不运行选择器并丢弃结果,也会更有效。文档:
由于.live()方法在事件传播到文档顶部后处理事件,因此无法停止实时事件的传播。类似地,由.delegate()处理的事件将始终传播到它们被委托到的元素;在调用委托事件处理程序时,它下面的任何元素上的事件处理程序都已执行
live()
的工作方式是,它在DOM(文档)的顶层放置一个处理程序,用于检测所选事件何时达到该级别(然后检查它是否由与选择器匹配的元素抛出)
delegate()
的工作方式相同,但处理程序放在所选元素上(因此它只能检测该元素的后代引发的事件)
live()
的缺点是1)检测和检查所有冒泡到文档级别的事件时固有的性能问题,以及2)您根本无法停止这些事件的传播(因为在它们到达文档级别之前,您不会知道它们)
delegate()
允许您将处理程序约束到一组较小的元素(与选择器及其子代匹配的元素)而不是整个页面,从而缓解了这两个问题。在选择相应的元素时,是否可以在Chrome Developer工具上看到事件侦听器?尽管$(“table td”).live('hover',function(){});
在使用时是一样的。each()
方法,不是吗?在您将.delegate()
附加到yes的元素上,您可以在它的数据(“事件”)
对象或$.cache[element[$.expando]]中看到它。事件
,其中elemenet[$.expando]
是您在元素上看到的jquery230420498204824=132
,132是$.cache
中的键,因此$.cache[132]。事件
是您要查找的对象。@Rodrigo-不,它正在为每个循环在文档上附加一个新的处理程序。但是$(“table td”).live('hover',function(){});
为每个选定元素附加一个新的处理程序,不是吗?可能重复
$("table td").live('hover', function() {});
$("table td").live('hover', function() {});