因此,如果我想点击按钮时会发生某些事情,我可以这样做:
<!-- 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 ...
任何见解都会有所帮助!
答案 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 listener
和second 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()
将事件处理程序附加到新元素的方法:
答案 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')" );
如果我们谈论的是性能,在任何情况下直接使用总是更快,但使用属性你只能分配一个功能。