【问题标题】:How to optimize jQuery event handlers for speed如何优化 jQuery 事件处理程序以提高速度
【发布时间】:2014-12-08 17:43:43
【问题描述】:

我正在尝试加快我们应用中的 javascript 执行速度。

看起来我绑定了 900 多个事件侦听器 -

var listenerCount = 0;    
var ael = Node.prototype.addEventListener;
Node.prototype.addEventListener = function() {
     listenerCount++;
     ael.apply(this, arguments);
}

我知道这会影响性能。是否可以通过调整我注册听众的方式来加快速度?例如,如果我尝试在同一个元素(使用不同的选择器)上注册 on 事件,那会更有效吗?

例如改变

$('#sidebar').find('select').on('click', 'option', handler1);
$('#sidebar').find('.className').on('click', 'a', handler2);

$('#sidebar').on('click', 'select option', handler1);
$('#sidebar').on('click', '.className a', handler2);

一般来说,我感兴趣的是注册所有内容所需的时间,而不是实际运行处理程序的时间(我知道不同的选择器执行不同)。当事件实际被触发时,我可能会交换额外的 10-50 毫秒,以减少注册事件的 1-5 毫秒 - 我希望应用程序能够快速加载!

我正在考虑编写一些可以进行选择器匹配的东西,以减少实际注册的事件数量,但我找不到其他人在做类似的事情(这让我觉得这可能很愚蠢)-

var sideBarDomEvents = (function(){
    var clickEvents = [],
    my = {
      init: function() {
        $sidebar = $('#sidebar');
        $sidebar.on('click', function(e){
          for (var i=0; i < clickEvents.length; i++) {
            if (clickEvents[i]['target'] == $(e.target) {
              clickEvents[i]['handler'](e);
            }
          }
        });
      },
      registerClickEvent: function($target, handler){
        // This only works if the target is the inner most element - bubbling isn't supported!
        clickEvents.push({'target':$target, 'handler': handler});
      }
    }
    return my;
})();

我真的不知道该走哪条路 - 我什至不知道在哪里衡量这些东西(我当然没有注意到 Chrome 的个人资料或时间线中的任何相关内容)。对 jquery 事件的性能影响的任何解释都会很棒。

【问题讨论】:

  • 事件委托与速度无关。你的问题太长太模糊了。只有当你有一个“糟糕”的书面选择器在很多元素上运行时,速度才会被感知到。这很慢,但人类可能不会看到。电脑速度慢。
  • 除了增加代码的复杂性之外,您将无法使用 jquery 做任何更好的事情。
  • @vsync 问题并不模糊或冗长。事实上,这个问题只有一句话长(并用问号标识)——“是否可以通过调整我注册事件监听器的方式来加快速度?”。其余的是背景信息。
  • @AidanEwen - 你是如何得出结论的,事情是“慢”的,你想加快它们的速度吗?什么对你来说很慢?太多的事件消耗更多的内存,但是900在内存消耗方面并不是一个很高的数字,但是,应该以合理的方式进行事件委托。
  • @vsync 我通过测量事情发生的时间得出结论,事情很慢。我想加快它们的速度,因为这将改善用户体验,并最终提高盈利能力。我们的 javascript 应用程序很慢。

标签: javascript jquery performance events


【解决方案1】:

将侦听器附加到同一个对象使得实际附加侦听器花费的时间更少,但捕获和处理事件的过程会更慢。

将侦听器附加到更靠近目标需要更多时间,但事件发生时处理程序会更快地触发。

感谢这个问题的回答 - Should all jquery events be bound to $(document)??

【讨论】:

  • 显然不是!为什么要将所有事件绑定到document?这太荒谬了。应用程序和网页中有不同的组件,因此事件委托应该在组件的 DOM 树中的最顶层元素上完成,该元素包含所有组件 DOM。当然你可以使用document,但是你必须使用非常严格的事件命名空间来区分事件并防止事件串通。
  • @vsync 如果这意味着我的页面加载速度快了 200 毫秒,我会将所有事件附加到文档中(即使我在事件实际触发时延迟了 50 毫秒)。
  • 事件肯定不会减慢您的应用速度。请提供链接,以便我检查此案。但肯定不是事件会减慢速度,除非以完全成熟的方式编写,例如拥有“无尽”数量的 DOM 元素并将数千个事件附加到它们。当然,没有任何理智的人会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2019-12-24
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多