Answers:
我认为,区别在于使用方式。
我更喜欢.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);
});
通过上述操作,将为每个与选择器匹配的元素创建一个单独的处理程序。那意味着
.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");
on('click' ...)
,请参见stackoverflow.com/a/3973060/759452,即。on('click.darkenallothersections' ...)
并同时具有on('click.displaynextstep' ...)
,那么我只能取消选择使用的那个绑定.unbind('click.displaynextstep')
on()
是jQuery的趋势。我不得不更新$(window).load(function() {});
到$(window).on("load", function (e) {})
时候我升级到jQuery的3
以下代码之间有什么区别?
不,问题中的两个代码示例之间没有功能上的区别。 .click(fn)
是的“快捷方式” .on("click", fn)
。从文档中.on()
:
对于某些事件,有一些速记方法,例如
.click()
可用于附加或触发事件处理程序的方法。有关速记方法的完整列表,请参阅事件类别。
请注意,它的.on()
区别.click()
在于它可以通过传递参数来创建委托事件处理程序selector
,而.click()
不能。当.on()
被称为没有一个selector
参数,它的行为完全一样.click()
。如果要事件委托,请使用.on()
。
.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() { ... });
.live()
真的吗?另外,这似乎与其他答案相反,后者说它仅具有的功能.click()
,因此不适用于将来的事件。
.on()
中所说的.click()
那样,它可以做什么,做什么.bind()
和.live()
做什么-它取决于您使用它调用什么参数。(其他一些答案也提到了这一点。)请注意,“绑定到#whatever内部的所有链接” 不是做什么的.live()
,而是这样.delegate()
做的。.live()
绑定到所有内部,document
而不是让您指定容器。注意.live()
从jQuery 1.7开始不推荐使用。
如其他答案所述:
$("#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(){});
.click()
。)
它们似乎是相同的。click()函数的文档:
此方法是.bind('click',handler)的快捷方式
on()函数的文档:
从jQuery 1.7开始,.on()方法提供了附加事件处理程序所需的所有功能。有关从较旧的jQuery事件方法转换的帮助,请参见.bind()、. delegate()和.live()。要删除与.on()绑定的事件,请参见.off()。
.click
vs中一个人比另一个人更好.on
在这里,您将获得应用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
})
就从互联网和一些朋友处获得的信息而言,在动态添加元素时使用.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提取相同的数据一样有效。按钮在更新或删除时不起作用: