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

bgc*_*ode 507 jquery click

以下代码有什么区别吗?

$('#whatever').on('click', function() {
     /* your code here */
});
Run Code Online (Sandbox Code Playgroud)

$('#whatever').click(function() {
     /* your code here */
});
Run Code Online (Sandbox Code Playgroud)

and*_*ter 732

我认为,不同之处在于使用模式.

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

考虑以下html:

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>
Run Code Online (Sandbox Code Playgroud)

我们在哪里添加新按钮

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

并希望"警报!" 显示警报.我们可以使用"点击"或"打开".


当我们使用 click

$("button.alert").click(function() {
    alert(1);
});
Run Code Online (Sandbox Code Playgroud)

如上所述,为匹配选择器的每个元素创建一个单独的处理程序.这意味着

  1. 许多匹配元素会创建许多相同的处理程序,从而增加内存占用
  2. 动态添加的项目将没有处理程序 - 即,在上面的html中新添加的"Alert!" 除非您重新绑定处理程序,否则按钮将无法工作.

当我们使用 .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});
Run Code Online (Sandbox Code Playgroud)

如上所述,为您的选择器匹配的所有元素单个处理程序,包括动态创建的元素.


......使用的另一个原因 .on

正如Adrien在下面评论的那样,另一个使用的理由.on是命名空间事件.

如果你添加一个处理程序,.on("click", handler)通常删除它将.off("click", handler)删除该处理程序.显然这只有在你对函数的引用时才有效,那么如果不这样做呢?您使用名称空间:

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });
Run Code Online (Sandbox Code Playgroud)

解除束缚

$("#element").off("click.someNamespace");
Run Code Online (Sandbox Code Playgroud)

  • @andreister:纠正我,如果我错了,但我相信另一个优点是使用`on('click'...)`时使用命名空间,请参阅http://stackoverflow.com/a/3973060/759452 ie .`on('click.darkenallothersections'...)`并且同时有'on('click.displaynextstep'...)`,然后我只能使用`.unbind('click)取消绑定我选择的那个. displaynextstep')` (8认同)
  • 任何人都可以解释为什么.on可以用于动态添加项目,但.click不能? (7认同)
  • 那么:$('button.alert').on('click',function(){alert(1);}); ? (2认同)
  • `on()`是jQuery的趋势.当我升级到jQuery 3时,我不得不更新`$(window).load(function(){});`到`$(window).on("load",function(e){})`. (2认同)

gil*_*ly3 36

以下代码有什么区别吗?

不,您的问题中的两个代码示例之间没有功能差异. .click(fn)是一种"快捷方法" .on("click", fn).从以下文档.on():

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

请注意,它的.on()不同之处.click()在于它能够通过传递参数来创建委托事件处理程序selector,而.click()不是.在.on()没有selector参数的情况下调用时,它的行为完全相同.click().如果您想要事件委派,请使用.on().

  • 更大的问题是为什么你在页面上有3000个问题.如果您遵循良好的UI模式,您应该永远不会在页面上拥有那么多信息.查看分页或延迟加载.即使使用事件委托来为所有这些元素提供单个事件处理程序也会更好. (11认同)
  • @rubo77 - 仅在通过传递`selector`参数使用[event delegation](http://api.jquery.com/on/#direct-and-delegated-events)时才能看到性能提升.如果你在没有`selector`参数的情况下调用`.on()`,那么使用`.click()`就没有性能提升. (5认同)
  • 性能问题怎么指出我的@andreister? (4认同)

Int*_*ang 22

.on()是从jQuery 1.7开始执行所有事件绑定的推荐方法.它推出的所有两者的功能.bind().live()为您传递不同的参数改变行为的一个功能.

正如你写的那样,两者之间没有区别.两者都将处理程序绑定到click事件#whatever.on()如果您愿意,可以提供额外的灵活性,允许您将子项触发的事件委托#whatever给单个处理函数.

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

  • @babonk - 这与其他答案并不矛盾,因为正如Interrobang在第一段中说的那样`.on()`可以做什么`.click()`做_and_做什么`.bind()`和`.live( )`do - 它取决于你用它调用的参数.(其他一些答案也提到了这一点.)请注意,"绑定到#whatever里面的所有链接"是_not_ what` .live()`,它就是`.delegate()`.`.live()`绑定到`document`中的所有内容,而不是让你指定容器.另请注意,从.jQuery 1.7开始,不推荐使用`.live()`. (3认同)

nnn*_*nnn 19

正如其他答案所述:

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

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

(显然还有其他类似的"keyup","focus"等快捷方法)

我发布额外答案的原因是提到如果你.click()没有参数调用会发生什么:

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");
Run Code Online (Sandbox Code Playgroud)

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

我还想提一下,如果你看一下jQuery源代码(在jquery-1.7.1.js中),你会发现内部的.click()(或者.keyup()等等)函数实际上会调用.on().trigger().显然这意味着你可以放心,他们确实有相同的结果,但这也意味着使用.click()有更多的开销 - 在大多数情况下不需要担心甚至想到任何事情,但理论上它在特殊情况下可能很重要.

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

$("#whatever").on("click keypress focus", function(){});
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 9

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

  • 甚至不是`.on`做委托事件的能力? (3认同)

dan*_*ana 8

它们看起来是一样的......来自click()函数的文档:

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

来自on()函数的文档:

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


小智 8

.click 事件仅在呈现元素时起作用,并且仅附加到DOM准备好时加载的元素.

.on 事件动态附加到DOM元素,当您想要将事件附加到在ajax请求或其他内容上呈现的DOM元素时(在DOM准备好之后),这会很有用.


Amj*_*d K 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
})
Run Code Online (Sandbox Code Playgroud)

  • $('.clickHere').off().on() 正是我所需要的。谢谢! (2认同)