[英]Difference between .on('click') vs .click()
下面的代码有什么区别吗?
$('#whatever').on('click', function() {
/* your code here */
});
和
$('#whatever').click(function() {
/* your code here */
});
我认为,区别在于使用模式。
我更喜欢.on
.click
.on
因为前者可以使用更少的内存并且可以用于动态添加的元素。
考虑以下 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”或“on”。
click
$("button.alert").click(function() {
alert(1);
});
有了上面的内容,为每个与选择器匹配的元素创建了一个单独的处理程序。 这意味着
.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");
从 jQuery 1.7 开始, .on()
是完成所有事件绑定的推荐方法。 它将.bind()
和.live()
所有功能整合到一个函数中,该函数会在您传递不同参数时改变行为。
正如您编写的示例一样,两者之间没有区别。 两者都将处理程序绑定到#whatever
的click
事件。 on()
提供了额外的灵活性,允许您将#whatever
的子#whatever
触发的事件委托给单个处理程序函数,如果您愿意的话。
// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });
正如其他答案所提到的:
$("#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()
或.trigger()
。 显然,这意味着您可以确信它们确实具有相同的结果,但这也意味着使用.click()
会产生更多的开销 - 在大多数情况下无需担心甚至考虑,但理论上它可能很重要在特殊情况下。
编辑:最后,请注意.on()
允许您在一行中将多个事件绑定到同一个函数,例如:
$("#whatever").on("click keypress focus", function(){});
.click
事件仅在元素被渲染时起作用,并且仅在 DOM 准备就绪时附加到加载的元素上。
.on
事件动态附加到 DOM 元素,当您想将事件附加到在 ajax 请求或其他内容上呈现的 DOM 元素时(在 DOM 准备好之后),这很有用。
在这里,您将获得应用点击事件的不同方式的列表。 您可以相应地选择合适的,或者如果您的点击不起作用,请尝试其中的替代方案。
$('.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
})
不,没有。
on()
是它的其他重载,以及处理没有快捷方法的事件的能力。
他们现在已经弃用了 click(),所以最好使用 on('click')
据我从网上和一些朋友了解到,动态添加元素时使用 .on() 。 但是当我在一个简单的登录页面中使用它时,点击事件应该将 AJAX 发送到 node.js 并在返回时附加新元素,它开始调用多 AJAX 调用。 当我将其更改为 click() 时,一切正常。 其实我以前没有遇到过这个问题。
新元素
如果您希望单击附加到新元素,则作为上述综合答案的附录,以突出显示关键点:
$('.UPDATE').click(function(){ }); **V/S**
$(document).on('click','.UPDATE',function(){ });
$(document).on('click','.UPDATE',function(){ });
$(document).on('click','.UPDATE',function(){ });
使用 jquery 可以像获取相同的数据一样有效地工作。 按钮在更新或删除时不起作用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.