为什么要使用jQuery on()而不是click()


86

当前使用jQuery,当我需要在发生点击时做一些事情时,我会像这样...

$(".close-box").click( function() {
    MoneyBox.closeBox();
    return false;
});

我正在看别人在项目上有的代码,他们这样做是...

$(".close-box").live("click", function () {
    MoneyBox.closeBox();
    return false;
});

请注意,就我所知,它似乎在做相同的事情,除了它们使用的是live()函数(现在已弃用并且jQuery文档说要使用live()函数),on()但是无论哪种方式,为什么要使用live / on()代替我的第一个示例?


3
除了功能之外,我更喜欢onclick因为click函数名称听起来像动词,是一个动作,它所要做的就是单击元素(就像您也可以使用相同的click功能一样)
1j01

Answers:


153

因为您可能具有动态生成的元素(例如,来自AJAX调用),所以您可能希望具有以前绑定到同一元素选择器的相同单击处理程序,然后使用on()带选择器参数来“删除” click事件

展示:

http://jsfiddle.net/AJRw3/

on()click()如果未指定选择器,则也可以是同义词:

$('.elementClass').click(function() { // code 
});

与...同义

$('.elementClass').on('click', function() { // code
});

从某种意义上说,它仅将处理程序一次添加到所有具有class的元素上elementClasselementClass例如$('<div class="elementClass" />'),如果您有一个新的源,则处理程序将不会绑定到该新元素上,则需要执行以下操作:

$('#container').on('click', '.elementClass', function() { // code
});

假设#container.elementClass祖先


40

有很多答案,每个答案都涉及几点-希望这可以给您答案,并且对什么是什么以及如何使用它进行了很好的解释。

使用click()是的别名bind('click' ...)bind()在设置事件侦听器时,using照原样使用DOM,并将函数绑定到DOM中的每个匹配元素。也就是说,如果您使用$('a').click(...)该代码,则会将提供的函数绑定到该代码运行时在DOM中找到的每个锚标记的click事件。

使用live()是jQuery中的旧方法。它被用来绑定事件,就像这样bind()做一样,但是它不仅在代码运行时将它们绑定到DOM中的元素-它还侦听DOM中的更改,并将事件也绑定到任何将来匹配的元素。如果您正在执行DOM操作并且需要一个事件存在于某些元素上,这些元素以后可能会被删除/更新/添加到DOM但在首次加载DOM时不存在,则这很有用。

live()现在折旧的原因是因为它实施不佳。为了使用live(),您必须能够最初选择DOM中的至少一个元素(我相信)。这也导致该函数的副本要绑定到每个元素上运行-如果您有1000个元素,那就是很多复制的函数。

on()功能的创建是为了克服这些问题。它使您可以将单个事件侦听器绑定到在DOM中不会更改的对象(因此,您不能on()在以后将其删除/添加到DOM的元素上使用-将该元素绑定到父对象),然后简单地应用元素“过滤器”,以便仅在将函数冒泡到与选择器匹配的元素时才运行该函数。这意味着您仅存在一个绑定到单个元素的函数(而不是一堆副本),这是在DOM中添加“实时”事件的一种更好的方法。

...这就是区别所在,以及每个功能为何存在以及为何live()被贬值。


3
虽然这个问题是关于.click()与.on()的,但这是对.live()和.on()之间差异的出色描述,这可能很难理解,这是有人第一次尝试替换现有的.live( )和.on()并使其无法正常工作。比官方文档中的解释要好得多。奖励点,用以解释.live()中的缺陷。
猫头鹰

19
  • $("a").live()-><a>即使它是在调用之后创建的,它也将应用于all 。
  • $("a").click()->它仅适用于所有<a>被调用的对象。(这是bind()on()中的快捷方式,在1.7中)
  • $("a").on()->提供附加事件处理程序所需的所有功能。(最新的jQuery 1.7)

行情

从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。较旧版本的jQuery的用户应优先使用.delegate()而不是.live()。
此方法提供了一种将委派事件处理程序附加到页面的document元素的方法,从而简化了将内容动态添加到页面时事件处理程序的使用。有关更多信息,请参见.on()方法中有关直接事件与委托事件的讨论。

.on()方法将事件处理程序附加到jQuery对象中当前选定的元素集。从jQuery 1.7开始,.on()方法提供了附加事件处理程序所需的所有功能。

对于早期版本,.bind()方法用于将事件处理程序直接附加到元素。


7

click()是的非委托方法的快捷方式on()。所以:

$(".close-box").click() === $(".close-box").on('click')

用委托事件on(),即。在动态创建的对象中,您可以执行以下操作:

$(document).on('click', '.close-box') // Same as $('.close-box').live()

但是,on()在任何静态元素中都引入了委托,而不仅documentlive()这样,所以:

$("#closestStaticElement").on('click', '.close-box')

1
感谢您将其命名为“ #closestStaticElement”,我不知道。
skam 2014年

$(document).on('click','.close-box')很完美!
Michael Grigsby

4

您应该阅读之间的区别livebind

简而言之,live使用事件委托,使您可以绑定到现在和将来存在的元素。

相反,通过bind(及其快捷方式,如click)附加的处理程序将处理程序直接附加到与选择器匹配的DOM元素上,因此仅绑定到现在存在的元素上。

的后果live的灵活性,性能降低,所以只有当你需要它提供的功能使用。




1

$ .click()仅仅是绑定或启用的快捷方式。从jQuery文档:

在前两个变体中,此方法是jQuery 1.7中.bind(“ click”,handler)以及.on(“ click”,handler)的快捷方式。在第三个变体中,当不带参数调用.click()时,它是.trigger(“ click”)的快捷方式。


1

.on()方法将事件处理程序附加到jQuery对象中当前选择的元素集。该click()方法将事件处理程序绑定到“ click” JavaScript事件,或在元素上触发该事件。

简而言之,.click(...如果选择器的目标发生动态变化(例如,通过一些Ajax响应),那么您需要再次分配行为。

.on(...是一个非常新的版本(jQuery 1.7),它可以使用委派事件涵盖现场情况,这是无论如何附加行为的一种更快的方法。


1

on方法中,事件处理程序附加到父元素而不是目标。

例: $(document).on("click", ".className", function(){});

在上面的示例中,单击事件处理程序附加到文档。并且它使用事件冒泡来了解是否有人单击了目标元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.