我在我的网络应用程序中使用jQuery。在阅读其文档时,我读到了live()
和delegate()
。虽然他们已经解释了这两种方法,但我不明白它们之间的确切区别。还不确定哪种方法在哪种情况下是理想的。
请帮助我清楚地了解这些方法。
由于
答案 0 :(得分:57)
.live()
要求您立即运行选择器,除非您使用的结果非常浪费。此处的事件处理程序附加到document
,因此必须检查来自任何元素冒泡的该类型的所有事件。这是一个用法示例:
$(".myClass").live("click", function() { alert("Hi"); });
请注意,语句$(".myClass")
运行该选择器以查找具有该类的所有元素,即使我们不关心它们,我们想要的所有是当".myClass"
事件冒泡到click
时,字符串document
以便以后匹配。
.delegate()
实际上在内部使用.live()
,但带有上下文。选择器不立即运行,因此它已经更有效率了,并且它不会附加到document
(虽然它可以)它更加本地......以及所有来自其他您不关心的元素树的其他事件甚至在冒泡时都不会被检查...再次更高效。这是一个用法示例:
$("#myTable").delegate("td", "click", function() { alert("Hi"); });
现在发生了什么?我们运行了$("#myTable")
来获取要附加的元素(确实比document
更昂贵,但我们使用结果。然后我们附加一个事件处理程序(或者那些在其他情况下的元素。只有来自 内的 clicks
才能在"td"
选择器发生时检查.live()
,而不是来自无处不在 { {1}}(因为所有都在document
内)。
答案 1 :(得分:6)
delegate()映射到jQuery代码中的 live()。主要区别在于 live()是在您希望将事件委托给其他元素的元素上调用的。 live()会将这些事件委托给文档对象。
另一方面,delegate()允许您通过传递选择器来设置委派给哪些元素事件。如果原始元素与选择器匹配,则处理冒泡到该元素的事件。
作为@NickCraver mentioned, delegate()比live更好,因为它不一定从页面上的每个元素捕获事件,也不会查询选择器权限程。
答案 2 :(得分:3)
来自jQuery文档:
从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。旧版jQuery的用户应该使用.delegate()而不是.live()。
答案 3 :(得分:0)
实时方法:
$("#mymethod").live("click", function() { alert("It checks the entire DOM"); });
实时方法检查整个DOM中的#mymethod(有时根据您的DOM内容需要时间)
委托方法:
$('.mycontainer').delegate('#mymethod','click',function() { alert('Checks only in mycontainer portion') });
Delagate不会搜索您的整个DOM,只搜索您的mycontainer部分。(提高性能)