Jquery 什么';.delegate()和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()中的事件在被捕获之

相当于使用.live()编写的以下代码:

根据

我打赌我错了,但这和写作不一样吗

$("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() {});