jQuery.click() 与 onClick

IT技术 javascript html jquery dom-events jquery-events
2021-02-06 03:09:17

我有一个巨大的 jQuery 应用程序,我正在使用以下两种方法来处理点击事件。

第一种方法

HTML

<div id="myDiv">Some Content</div>

jQuery

$('#myDiv').click(function(){
    //Some code
});

第二种方法

HTML

<div id="myDiv" onClick="divFunction()">Some Content</div>

JavaScript 函数调用

function divFunction(){
    //Some code
}

我在我的应用程序中使用第一种或第二种方法。哪一个更好?性能更好?和标准?

6个回答

使用$('#myDiv').click(function(){更好的,因为它遵循标准的事件注册模型。(jQuery 在内部使用addEventListenerattachEvent)。

基本上以现代方式注册事件处理事件不显眼的方式。此外,要为目标注册多个事件侦听器,您可以addEventListener()为同一目标调用

var myEl = document.getElementById('myelement');

myEl.addEventListener('click', function() {
    alert('Hello world');
}, false);

myEl.addEventListener('click', function() {
    alert('Hello world again!!!');
}, false);

http://jsfiddle.net/aj55x/1/

为什么要使用 addEventListener?(来自 MDN)

addEventListener 是注册 W3C DOM 中指定的事件侦听器的方法。它的好处如下:

  • 它允许为一个事件添加多个处理程序。这对于即使使用其他库/扩展也需要正常工作的 DHTML 库或 Mozilla 扩展特别有用。
  • 当侦听器被激活(捕获与冒泡)时,它可以让您对相位进行更细粒度的控制
  • 它适用于任何 DOM 元素,而不仅仅是 HTML 元素。

更多关于现代事件注册 -> http://www.quirksmode.org/js/events_advanced.html

其他方法如设置HTML 属性,例如:

<button onclick="alert('Hello world!')">

DOM 元素属性,例如:

myEl.onclick = function(event){alert('Hello world');}; 

是旧的,它们可以很容易地被覆盖。

应避免使用HTML 属性,因为它会使标记更大且可读性更低。对内容/结构和行为的关注没有很好地分开,使得错误更难找到。

DOM 元素属性方法的问题在于每个事件只能将一个事件处理程序绑定到一个元素。

更多关于传统事件处理 -> http://www.quirksmode.org/js/events_tradmod.html

MDN 参考:https : //developer.mozilla.org/en-US/docs/DOM/event

我同意@supertonsky。我强烈不同意 $('#myDiv').click(function(){ 更好。在大型 javascript 应用程序中绑定一个事件变得非常困难,找到绑定到该目标的所有引用。它是类上的绑定吗? ,一个 id,一个 html 标签的子引用?如果 css 更改并且您必须更改类名会发生什么?根据我与其他代码一起工作的经验,它变得非常丑陋非常快。
2021-03-14 03:09:17
假设您先运行$('#myDiv').click(function(){代码,然后从 JavaScript 动态生成 20 行 HTML,每行上都有一个按钮,单击该按钮时,JavaScript 需要执行相同的功能。如果您先执行此操作,则它将无法工作,因为在生成 HTML 之前已添加了事件处理程序。onclick="functionName()"放入动态生成的 HTML 中似乎更容易,然后按钮立即起作用。或者您知道针对这种情况的更优雅的解决方案吗?
2021-03-17 03:09:17
@Vega,好点。可读性怎么样?现在您必须搜索页面上所有引用的 JS 文件,才能通过元素 ID 来查看元素的所有点击处理程序,而不是搜索函数名称。你怎么看?
2021-03-21 03:09:17
@SimonRobb.live已弃用。使用.delegate旧版本或使用.on较新的jQuery版本。
2021-04-02 03:09:17
@zuallauz 在这种情况下,jQuery 提供了.delegate()功能。它将事件附加到将来出现在站点上的任何元素上。
2021-04-03 03:09:17

为了获得更好的性能,请使用本机 JavaScript。为了更快的开发,请使用 jQuery。检查jQuery 与 Native Element Performance 的性能比较

我已经在 Firefox 16.0 32 位 Windows Server 2008 R2 / 7 64 位上做了一个测试

$('span'); // 6,604 operations per second
document.getElementsByTagName('span'); // 10,331,708 operations/sec

对于单击事件,请检查Native Browser events vs jquery triggerjQuery vs Native Click Event Binding

在 Windows Server 2008 R2 / 7 64 位上的 Chrome 22.0.1229.79 32 位中测试

$('#jquery a').click(window.testClickListener); // 2,957 operations/second

[].forEach.call( document.querySelectorAll('#native a'), function(el) {
    el.addEventListener('click', window.testClickListener, false);
}); // 18,196 operations/second
使用 forEach 时要小心,因为并非所有浏览器都兼容,例如我认为不适用于 IE。也许 polyfill 会有用。
2021-03-21 03:09:17
jQuery 应该能够在许多不同的环境中运行,这使得它更加强大,并且更容易编写和维护,但如果速度是最重要的,那么 jQuery 不是答案
2021-03-25 03:09:17

据我了解,您的问题并不是关于是否使用 jQuery。而是:在 HTML 中内联绑定事件还是通过事件侦听器绑定事件更好?

不推荐使用内联绑定。此外,通过这种方式,您只能将一个函数绑定到某个事件。

因此我建议使用事件侦听器。这样,您就可以将多个函数绑定到单个事件,并在以后需要时解除绑定。考虑这个纯 JavaScript 代码:

querySelector('#myDiv').addEventListener('click', function () {
    // Some code...
});

这适用于大多数现代浏览器。

但是,如果您已经在项目中包含了 jQuery — 只需使用 jQuery:.on.click函数。

可以使用内联 HTML 注册多个函数,例如 <div onclick="handler1();handler2();handler3();"></div>
2021-03-11 03:09:17
我提到我不确定禁用的 JavaScript。我没有误导或欺骗他人
2021-03-13 03:09:17
在这种情况下,您可以尝试以下 <div onclick="function() { try { handler1();handler2();handler3(); } catch { } }"></div>
2021-03-16 03:09:17
这样你仍然只注册一个“表达式”。例如,如果handler1抛出错误,handler2并且handler3永远不会被调用。此外,您无法从侦听器动态添加和删除某些功能。最后但并非最不重要的,handler1handler2并且handler3必须在全球范围内是一种气味声明。
2021-03-25 03:09:17
在未定义的情况下try..catchhandler2函数内部使用将不起作用仅供参考,当用户浏览器中禁用 JS 时,内联 JavaScript 显然不起作用,请不要误导他人。
2021-04-05 03:09:17

您可以组合它们,使用 jQuery 将函数绑定到点击

<div id="myDiv">Some Content</div>

$('#myDiv').click(divFunction);

function divFunction(){
 //some code
}

去做这个,因为它会给你标准和性能。

 $('#myDiv').click(function(){
      //Some code
 });

由于第二种方法是简单的 JavaScript 代码并且比 jQuery 更快。但这里的性能将大致相同。