我有一个巨大的jQuery应用程序,我正在使用以下两种方法进行点击事件 .
First method
HTML
<div id="myDiv">Some Content</div>
jQuery
$('#myDiv').click(function(){
//Some code
});
Second method
HTML
<div id="myDiv" onClick="divFunction()">Some Content</div>
JavaScript函数调用
function divFunction(){
//Some code
}
我在我的应用程序中使用第一种或第二种方法 . 哪一个更好?性能更好?和标准?
16 回答
使用
onclick
的第一种方法不是jQuery而只是Javascript,所以你不会得到jQuery的开销 . 如果你需要将jQuery方法添加到其他元素而不向每个元素添加事件处理程序,那么jQuery方法可以通过选择器进行扩展,但是现在你只需要使用jQuery就可以了 .就个人而言,因为你使用的是jQuery,我会坚持使用它,因为它是一致的,并且会将标记与脚本分离 .
为此,它将为您提供标准和性能 .
第二种方法是简单的JavaScript代码,比jQuery更快 . 但这里的表现大致相同 .
关注点的分离在这里是关键,因此事件绑定是普遍接受的方法 . 这基本上是许多现有答案所说的 .
However don 't throw away the idea of declarative markup too quickly. It has it'这个地方,以及像Angularjs这样的框架,是其中心 .
需要有一个理解,整个__1096969被如此沉重地羞辱,因为它被一些开发人员滥用 . 所以它达到了亵渎神圣的程度,就像
tables
一样 . 一些开发人员实际上避免使用表格数据tables
. 这是人们在不理解的情况下行事的完美典范 .虽然我喜欢把我的行为与我的观点分开的想法 . 我发现标记声明 what 没有问题(不是 how 它做了,这是行为) . 它可能是实际的onClick属性或自定义属性的形式,就像bootstraps javascript组件一样 .
这样,通过只看一下标记,你可以看到是什么,而不是试图反向查找javascript事件 Binders .
因此,作为上述的第三种替代方法,使用数据属性来声明性地宣告标记内的行为 . 行为被排除在视野之外,但一眼就能看出发生了什么 .
Bootstrap示例:
资料来源:http://getbootstrap.com/javascript/#popovers
Note 第二个例子的主要缺点是全局命名空间的污染 . 这可以通过使用上面的第三个替代方案,或者像Angular这样的框架及其具有自动范围的ng-click属性来规避 .
作品的差异 . 如果使用click(),则可以添加多个函数,但如果使用属性,则只执行一个函数 - 最后一个 .
DEMO
HTML
JavaScript
如果我们谈论性能,在任何情况下直接使用总是更快,但使用属性,您将只能分配一个功能 .
单击按钮时执行JavaScript:
$('#myDiv').click
更好,因为它将JavaScript代码与HTML分开 . 必须尝试保留页面 behaviour and structure different . 这有很大帮助 .你可以将它们组合起来,使用jQuery将函数绑定到click
两者都不是更好,因为它们可能用于不同的目的 .
onClick
(实际应该是onclick
)表现得稍微好一点,但我非常怀疑你会注意到那里的差异 .值得注意的是,它们可以执行不同的操作:
.click
可以绑定到任何jQuery集合,而onclick
必须在您希望它绑定到的元素上内联使用 . 您也可以只使用onclick
绑定一个事件,而.click
允许您继续绑定事件 .在我看来,我会保持一致,只是在任何地方使用
.click
并将我的所有JavaScript代码保存在一起并与HTML分开 .不要使用
onclick
. 没有't any reason to use it unless you know what you'正在做,你可能没有 .好吧,jQuery背后的主要思想之一是将JavaScript与令人讨厌的HTML代码分开 . 第一种方法是要走的路 .
大多数时候,当性能是唯一的标准时,原生JavaScript方法是比jQuery更好的选择,但jQuery使用JavaScript并使开发变得容易 . 您可以使用jQuery,因为它不会过多地降低性能 . 在您的具体情况下,性能的差异是可以忽略的 .
恕我直言,onclick是仅在满足以下条件时优先于.click的方法:
页面上有很多元素
只有一个要为click事件注册的事件
您担心移动性能/电池寿命
我形成了这个观点,因为移动设备上的JavaScript引擎比同代的桌面版本慢了4到7倍 . 当我访问我的移动设备上的网站并接收抖动滚动时,我讨厌它,因为jQuery以牺牲我的用户体验和电池寿命为代价来绑定所有事件 . 另一个最近的支持因素,虽然这应该只是政府机构关注的问题;),我们在IE7中弹出一个消息框,说明JavaScript进程需要很长时间......等待或取消进程 . 每当有很多元素通过jQuery绑定时就会发生这种情况 .
第一种方法是偏好 . 它使用advanced event registration model[s],这意味着您可以将多个处理程序附加到同一个元素 . 您可以轻松访问事件对象,处理程序可以存在于任何函数的范围内 . 而且,它是动态的,即它可以被调用任何时候,特别适合动态生成的元素 . 无论您使用jQuery,其他库还是本机方法都无关紧要 .
第二种方法使用内联属性,需要大量的全局函数(这会导致命名空间污染),并将内容/结构(HTML)与行为(JavaScript)混合在一起 . 不要使用它 .
您无法轻易回答有关性能或标准的问题 . 这两种方法完全不同,并做了不同的事情 . 第一个是更强大的,而第二个被鄙视(被认为是糟糕的风格) .
onclick, onmouseover, onmouseout, etc. 事件实际上是 bad for performance (主要在Internet Explorer中,请参见图) . 如果使用Visual Studio进行编码,则在运行带有这些内容的页面时,每个页面都会创建一个占用内存的单独SCRIPT块,从而降低性能 .
更不用说你应该有separation of concerns:JavaScript和布局应该分开!
为任何这些事件创建evenHandler总是更好,一个事件可以捕获数百/数千个项目,而不是为每个事件创建数千个单独的脚本块!
(另外,其他人都在说 . )
据我所知,你的问题不是关于是否使用jQuery . 更确切地说:将事件内联在HTML中还是通过事件监听器更好?
不推荐使用内联绑定 . 此外,您只能将一个函数绑定到某个事件 .
因此,我建议使用事件监听器 . 这样,您就可以将许多函数绑定到单个事件,并在以后根据需要取消绑定它们 . 考虑这个纯JavaScript代码:
这适用于大多数现代浏览器 .
但是,如果您已在项目中包含jQuery - 只需使用jQuery:
.on
或.click
函数 .使用
$('#myDiv').click(function(){
是 better ,因为它遵循标准事件注册模型 . (jQuery internally使用addEventListener和attachEvent) .基本上在modern way中注册事件是unobtrusive处理事件的方式 . 另外,要为目标注册多个事件侦听器,可以为同一目标调用
addEventListener()
.http://jsfiddle.net/aj55x/1/
更多关于现代活动注册 - > http://www.quirksmode.org/js/events_advanced.html
其他方法,如设置HTML attributes,例如:
或DOM element properties,例如:
已经老了,很容易被写完 .
应避免使用 HTML attribute ,因为它会使标记更大且可读性更低 . 对内容/结构和行为的关注并没有很好地分离,使得更难找到bug .
DOM element properties 方法的问题是每个事件只能将一个事件处理程序绑定到一个元素 .
有关传统事件处理的更多信息 - > http://www.quirksmode.org/js/events_tradmod.html
MDN参考:https://developer.mozilla.org/en-US/docs/DOM/event
为了获得更好的性能,请使用本机JavaScript . 为了加快开发速度,请使用jQuery . 检查jQuery vs Native Element Performance的性能比较 .
我已经在Windows Server 2008 R2 / 7 64位上对Firefox 16.0 32位进行了测试
对于单击事件,请选中Native Browser events vs jquery trigger或jQuery vs Native Click Event Binding .
在Windows Server 2008 R2 / 7 64位上以32位格式在Chrome 22.0.1229.79中进行测试