on(“click”,function())和onclick =“function();”之间有什么区别?

时间:2013-07-31 03:37:52

标签: javascript jquery html event-handling

因此,如果我想点击按钮时会发生某些事情,我可以这样做:

<!-- EXAMPLE A-->
<input type="button" onclick="alert('hello world');">

或者我可以做到

<!-- EXAMPLE B-->
<input type="button" id="clickme">
<script>
   $('#clickme').on("click",function(){alert('hello world');});
</script>

当然,任何变体(在change上,hover上)和快捷键(.click() .change())都是可能的......

除了A更短,有什么区别?哪个更好,为什么?

我注意到,当我使用.html()向网站动态添加元素时(如按钮)B不适用于这个新创建的按钮,我需要使用A ...

任何见解都会有所帮助!

4 个答案:

答案 0 :(得分:11)

<input type="button" onclick="alert('hello world');">

这是内联事件的处理方式。这是一个坏主意的主要原因是明确定义separation of concerns.

HTML - Structure of your page

JS   - Your page functionality

从长远来看,当系统尺寸缩小时,这将减少维护问题。

如果您的页面上有100个按钮,并且您想要删除点击事件或为所有这些事件进行更改,会发生什么情况。这绝对是一场噩梦。 如果将其绑定在内,也只能定义一个事件。

通过移动到单独的文件,您可以获得很大的灵活性,只需进行一些小的更改即可影响页面上的所有元素。

所以第二种方法总是更好。以及要走的路。

通过定义下面的事件

$('#clickme').on("click",function(){alert('hello world');});

HTML看起来没有任何功能,并消除了紧耦合。

在您动态添加的情况下,内联事件始终有效,但有一个名为事件委派的概念。您将事件附加到页面上始终存在的父容器,并将事件绑定到该容器。当事件稍后在元素上发生时,事件会冒泡到父级,为您处理事件。

对于此类情况,您使用.on传递选择器

来绑定事件
$(document).on('click', '#clickme', function() {

请记住,将多个事件绑定到文档是个坏主意。您始终可以使用closestStaticAncestor绑定事件。

答案 1 :(得分:1)

第一种方法只允许您注册一个单击侦听器,而第二种方法允许您注册任意数量的单击侦听器。

如果您希望同时听到动态添加元素的点击次数,则应使用.on()。这里有一些代码可以证明这一点(jsfiddle):

HTML

<div id="mainDiv">
<span class="span1">hello</span>
</div>

JS

$(document).on("click", ".span1", function () {
   $( "#mainDiv" ).append("<span class=\"span1\">hello</span>");
});

$(".span1").click( function () {
   console.log( "first listener" );
}); 

$(".span1").click( function () {
   console.log( "second listener" );
}); 

请注意,first listenersecond listener仅在单击第一个hello时打印,而在单击任何跨度时添加新的span

答案 2 :(得分:0)

猜猜这是你真正的问题:

  

我注意到,当我使用.html()动态添加元素时   网站(如按钮)B不适用于这个新创建的按钮,   我需要使用A ...

只需使用.on()功能中的选择器,并使用使用A CLASS 而不是 DUPLICATE ID 来表示多个元素:

$('document').on("click", ".myButtons", function(){
    alert('hello world');
});

按钮 - 更改为类(如果使用ID,则只选择 FIRST ):

<input type="button" class="myButtons" />
<input type="button" class="myButtons" />

这是您应该使用.on()将事件处理程序附加到新元素的方法:

<强> https://stackoverflow.com/a/14354091/584192

答案 3 :(得分:-1)

工作上的差异,如果你使用click()你可以添加几个fn,但是如果你使用属性只会执行一个函数 - 最后一个

HTML-

<span id="JQueryClick">Click #JQuery</span> </br>
<span id="JQueryAttrClick">Click #Attr</span> </br>

JS -

$('#JQueryClick').on("click", function(){alert('1')});
$('#JQueryClick').on("click", function(){alert('2')});

$('#JQueryAttrClick').attr('onClick'," alert('1')" );//this doesn't work    
$('#JQueryAttrClick').attr('onClick'," alert('2')" );

如果我们谈论的是性能,在任何情况下直接使用总是更快,但使用属性你只能分配一个功能。

Try This

Reference