.on('click')与.click()之间的区别


526

以下代码之间有什么区别?

$('#whatever').on('click', function() {
     /* your code here */
});

$('#whatever').click(function() {
     /* your code here */
});

Answers:


761

我认为,区别在于使用方式。

我更喜欢.on.click因为前者可以使用更少的内存并为动态添加的元素工作。

考虑以下html:

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

我们通过添加新按钮

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

并想要“警惕!” 显示警报。为此,我们可以使用“单击”或“启用”。


当我们使用 click

$("button.alert").click(function() {
    alert(1);
});

通过上述操作,将为每个与选择器匹配的元素创建一个单独的处理程序。那意味着

  1. 许多匹配的元素将创建许多相同的处理程序,从而增加内存占用量
  2. 动态添加的项目将没有处理程序-即,在上面的html中,新添加的“警告!” 除非您重新绑定处理程序,否则按钮将不起作用。

当我们使用 .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

通过上述操作,可以为与选择器匹配的所有元素(包括动态创建的元素)提供单个处理程序。


...另一个使用理由 .on

正如下面的Adrien所述,另一个使用原因.on是命名空间事件。

如果您.on("click", handler)通常添加一个处理程序,则将.off("click", handler)其删除,使用该处理程序将删除该处理程序。显然,只有在引用了该函数的情况下,此方法才有效,否则,该怎么办?您使用命名空间:

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

通过解除绑定

$("#element").off("click.someNamespace");

2
怎么样:$('button.alert')。on('click',function(){alert(1);}); ?
马修(Matthew)

8
@andreister:如果我错了,请纠正我,但我相信另一个优点是在使用时使用名称空间on('click' ...),请参见stackoverflow.com/a/3973060/759452,即。on('click.darkenallothersections' ...)并同时具有on('click.displaynextstep' ...),那么我只能取消选择使用的那个绑定.unbind('click.displaynextstep')
Adrien Be

我不认为会为与选择器匹配的每个元素创建单独的处理程序。我认为将创建1个处理程序,但是开销来自将该处理程序绑定到多个元素并监视所有这些元素。至少,我没有在文档中找到它。
追踪

7
谁能解释为什么.on可以用于动态添加的项目,但是.click不能?
MengT 2014年

2
on()是jQuery的趋势。我不得不更新$(window).load(function() {});$(window).on("load", function (e) {})时候我升级到jQuery的3
维克多·斯托达德

37

以下代码之间有什么区别?

不,问题中的两个代码示例之间没有功能上的区别。 .click(fn)是的“快捷方式” .on("click", fn)。从文档中.on()

对于某些事件,有一些速记方法,例如.click()可用于附加或触发事件处理程序的方法。有关速记方法的完整列表,请参阅事件类别

请注意,它的.on()区别.click()在于它可以通过传递参数来创建委托事件处理程序selector,而.click()不能。当.on()被称为没有一个selector参数,它的行为完全一样.click()。如果要事件委托,请使用.on()


4
我的@andreister指出的性能问题呢?
rubo77

@ rubo77最多可以忽略不计。我们用的是单位数毫秒。
罗里·麦克罗斯桑

1
@RoryMcCrossan虽然对我来说很重要-我正在寻找它,因为我在一个页面上有多达3000个需要事件的问题。每1毫秒可以使我的页面花费3秒以上的时间来执行。您的评论对大名单没有帮助。
兰迪

11
更大的问题是为什么页面上有3000个问题。如果遵循良好的UI模式,则页面上永远不会有那么多信息。查看分页或延迟加载。甚至使用事件委托为所有这些元素都使用单个事件处理程序会更好。
罗里·麦克罗森

5
@ rubo77-仅在通过传递参数使用事件委托时才能看到性能提升selector。如果.on()不带selector参数调用,则使用不会提高性能.click()
gilly3'3

23

.on()从jQuery 1.7开始,推荐的方法是进行所有事件绑定。它同时滚动了.bind().live()成一个功能,当您将它传递不同的参数会改变行为。

如您所写的示例,两者之间没有区别。两者都将处理程序绑定到的click事件#whateveron()提供了更大的灵活性,允许您将子级激发的事件委托#whatever给单个处理程序函数(如果选择)。

// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });

“绑定到#what中的所有链接,甚至以后创建的新链接。” 那不是.live()真的吗?另外,这似乎与其他答案相反,后者说它仅具有的功能.click(),因此不适用于将来的事件。
bgcode '02

3
@babonk-这与其他答案没有矛盾,因为正如Interrobang在第一段.on()中所说的.click()那样它可以做什么做什么.bind().live()做什么-它取决于您使用它调用什么参数。(其他一些答案也提到了这一点。)请注意,“绑定到#whatever内部的所有链接” 不是做什么的.live(),而是这样.delegate()做的。.live()绑定到所有内部,document而不是让您指定容器。注意.live()从jQuery 1.7开始不推荐使用。
nnnnnn '02

委派事件的+1:“通过选择保证在委派委派事件处理程序时存在的元素,可以使用委派事件避免频繁附加和删除事件处理程序的需要。” api.jquery.com/on
jimasp 2014年

19

如其他答案所述:

$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })

请注意,虽然它.on()支持其他几种.click()不支持的参数组合,但允许它处理事件委托(取代.delegate().live())。

(显然,还有其他类似的“ keyup”,“ focus”等快捷方式。)

我发布额外答案的原因是提及如果.click()不带参数调用会发生什么情况:

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");

请注意,如果您.trigger()直接使用,还可以传递额外的参数或jQuery事件对象,而这是您不能使用的.click()

我还想提及一下,如果您查看jQuery源代码(在jquery-1.7.1.js中),您会发现内部.click()(或.keyup()等)函数实际上将调用.on()or .trigger()。显然,这意味着您可以放心,它们的确具有相同的结果,但这也意味着使用时会.click()产生一点点额外的开销-在大多数情况下无需担心或什至无需考虑,但从理论上讲,在特殊情况下这可能很重要。

编辑:最后,请注意,它.on()允许您将多个事件绑定到同一行中的同一函数,例如:

$("#whatever").on("click keypress focus", function(){});

两种方法都不都加载到内存中使用吗?没关系吗?为了可读性,它也许更方便?
文斯五世

@VinceV。-是的 对于“标准”非委托事件处理程序,这两种方法都做同样的事情,并且性能差异可以忽略不计,因此,使用哪种方法实际上取决于个人喜好。(我通常会选择.click()。)
nnnnnn 2012年

9

不,没有。
关键on()是它的其他重载,以及处理没有快捷方法的事件的能力。


1
@arigold:这些是其他重载。
SLaks

9

它们似乎是相同的。click()函数的文档:

此方法是.bind('click',handler)的快捷方式

on()函数的文档:

从jQuery 1.7开始,.on()方法提供了附加事件处理程序所需的所有功能。有关从较旧的jQuery事件方法转换的帮助,请参见.bind()、. delegate()和.live()。要删除与.on()绑定的事件,请参见.off()。


您的两个视图都应该合并。Click()是.Bind()和.On()的快捷方式...根据JQUERY 1.7.0 +,它也是Trigger('click')的快捷方式。[ api.jquery.com/click/]
Dhanasekar 2012年

这是来自文档的非常直接的解释,但是以下答案提供了一个很好的示例,说明了为什么.clickvs中一个人比另一个人更好.on
phatskat

@phatskat-我碰巧同意您的意见:)
dana

8

.click 事件仅在元素被渲染时起作用,并且仅在DOM准备就绪时才附加到加载的元素上。

.on 事件是动态附加到DOM元素的,这对将事件附加到在ajax请求或其他情况下呈现的DOM元素(在DOM准备就绪后)很有用。


5

在这里,您将获得应用click事件的不同方式的列表。您可以选择适当的选择,或者如果单击不起作用,请尝试使用其他方法。

$('.clickHere').click(function(){ 
     // this is flat click. this event will be attatched 
     //to element if element is available in 
     //dom at the time when JS loaded. 

  // do your stuff
});

$('.clickHere').on('click', function(){ 
    // same as first one

    // do your stuff
})

$(document).on('click', '.clickHere', function(){
          // this is diffrent type 
          //  of click. The click will be registered on document when JS 
          //  loaded and will delegate to the '.clickHere ' element. This is 
          //  called event delegation 
   // do your stuff
});

$('body').on('click', '.clickHere', function(){
   // This is same as 3rd 
   // point. Here we used body instead of document/

   // do your stuff
});

$('.clickHere').off().on('click', function(){ // 
    // deregister event listener if any and register the event again. This 
    // prevents the duplicate event resistration on same element. 
    // do your stuff
})

3

现在,他们已弃用click(),因此最好使用on('click')


那么,如果您现在想要旧的click()行为,该怎么办?
bgcode

1

就从互联网和一些朋友处获得的信息而言,在动态添加元素时使用.on()。但是,当我在一个简单的登录页面中使用它时,单击事件应将AJAX发送到node.js,并在返回时附加新元素,它开始调用多个AJAX调用。当我将其更改为click()时,一切正常。其实我以前没有遇到过这个问题。


0

新元素

作为上述综合答案的补充,以突出关键点(如果您希望单击附加到新元素上):

  1. 由第一个选择器选择的元素,例如$(“ body”)必须在进行声明时存在,否则不附加任何内容。
  2. 您必须在.on()函数中使用三个参数,其中包括目标元素的有效选择器作为第二个参数。

-1
$('.UPDATE').click(function(){ }); **V/S**    
$(document).on('click','.UPDATE',function(){ });

$(document).on('click','.UPDATE',function(){ });
  1. 比$('。UPDATE')。click(function(){})更有效;
  2. 它可以使用更少的内存,并可以动态添加元素。
  3. 在使用表单的行数据进行“编辑”或“删除数据”时,使用“编辑和删除”按钮动态获取数据的某些时间不会生成JQuery事件,该时间$(document).on('click','.UPDATE',function(){ });实际上与使用jquery提取相同的数据一样有效。按钮在更新或删除时不起作用:

在此处输入图片说明


$(document).on('click','。UPDATE',function(){}); 1)比$('。UPDATE')。click(function(){})更有效;2)它可以使用更少的内存,并可以动态添加元素。3)一些时间使用编辑和删除按钮动态获取的数据在表单中的行数据的EDIT或DELETE DATA时不生成JQuery事件,当时$(document).on('click','。UPDATE',function() {}); 是有效的。[就像使用jquery获取相同的数据一样。按钮在更新或删除时不起作用
Devang Hire '18
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.