简体   繁体   English

为什么jQuery中的事件绑定比原生javascript慢得多?

[英]Why is event binding in jQuery so much slower than native javascript?

I have put up a little JSPerf to test out performance of event bindings in Javascript. 我已经提出了一个JSPerf来测试Javascript中事件绑定的性能。 I knew that native javascript will be the fastest, but what really suprised me, by how bug margin is jQuery slower. 我知道原生的javascript会是最快的,但真正令我感到惊讶的是,jQuery的bug差距是多么慢。 And also a big difference between running jQuery binding on javascript object and on jQuery object. 并且在javascript对象和jQuery对象上运行jQuery绑定之间也有很大的区别。

Code I have used is below. 我使用的代码如下。 JSPerf for this code is here . 此代码的JSPerf就在这里

var div = document.createElement('DIV');
var handler = function(){};
var jq_div = $('div');

// #1 - native javascript test code
div.addEventListener('click', handler);

// #2 - jquery event binding on javascript object
$(div).on('click', handler);

// #3 - jquery event binding on jquery object
jq_div.on('click', handler);

Can someone explain me why are these difference, mainly between cases #2 and #3. 有人可以解释一下为什么这些区别,主要是在案例#2和#3之间。 I wasn't expecting much difference there. 我没想到那里会有太大的不同。 And also, if there is any way how to improve jquery event binding perfomance ? 而且,如果有任何方法如何提高jquery事件绑定性能?

Thank you for your effort in advance. 感谢您提前付出的努力。

Can someone explain me why are these difference 有人能解释我为什么这些不同

jQuery has to do everything that the native binding does - plus a huge lot of overhead that jQuery uses for its internal event system. jQuery必须完成本机绑定所做的一切 - 加上jQuery用于其内部事件系统的大量开销。

mainly between cases #2 and #3 主要在案例#2和#3之间

Your var jq_div = $('div'); 你的var jq_div = $('div'); is wrong. 是错的。 It does select all div elements in the page and will bind events to all of them; 它确实选择了页面中的所有div元素 ,并将事件绑定到所有div元素 ; you wanted var jq_div = $(div); 你想要var jq_div = $(div); or var jq_div = $('<div>'); var jq_div = $('<div>'); .

Is there any way how to improve jquery event binding perfomance? 有没有办法如何提高jquery事件绑定性能?

No. And there's absolutely no need. 不,并且绝对没有必要。 Binding (in contrast to "firing") an event happens almost never in an application - it's a very rare task. 绑定 (与“触发”相反)事件几乎从未在应用程序中发生 - 这是一项非常罕见的任务。 And as your jsperf test confirms, it still is happening thousands of times per second, which is fast enough. 正如你的jsperf测试证实的那样,它仍然每秒发生数千次,这足够快。 If you really find yourself needing to bind events to very many elements at a time, use event delegation. 如果您确实发现自己需要一次将事件绑定到很多元素,请使用事件委派。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM