2014-12-08 2 views
-2

Я пытаюсь ускорить выполнение javascript в нашем приложении.Как оптимизировать обработчики событий jQuery для скорости

Похоже, Я 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-событий было бы замечательным.

+2

мероприятие делегация не о ** скорость **. ваш вопрос слишком длинный и слишком расплывчатый. скорость воспринимается только в том случае, если у вас есть «плохой» письменный селектор, работающий над лоттом элементов. это медленно, но не то, что люди, вероятно, увидят. медленный для компьютера. – vsync

+1

вы не сможете сделать ничего лучше w/jquery, кроме увеличения сложности вашего кода. –

+1

@vsync вопрос не расплывчатый или длинный. На самом деле вопрос заключается только в одном предложении долго (и идентифицируется с вопросительным знаком) - «возможно ли ускорить процесс, регулируя способ регистрации слушателей событий?». Остальное - справочная информация. –

ответ

0

Прикрепление слушателей к одному и тому же объекту делает фактическое подключение слушателей меньше времени, но процесс ловли и обработки событий будет медленнее.

Прикрепление слушателей ближе к цели занимает больше времени, но обработчики срабатывают быстрее, когда происходит событие.

По этому вопросу ответа - Should all jquery events be bound to $(document)??

+0

очевидно нет! почему вы связываете все события с «документом»? это абсурдно. Приложения и веб-страницы имеют в них разные компоненты, поэтому делегирование событий должно выполняться на самом верхнем элементе компонента в дереве DOM, который обертывает все компоненты DOM.конечно, вы могли бы использовать 'document', но тогда вам нужно будет использовать очень строчное пространство имен событий, чтобы отличать события и предотвращать сговор событий. – vsync

+0

@vsync Я бы приложил все свои события к документу, если бы это означало, что моя страница загружалась на 200 мс быстрее (даже если я понесла 50 мс отставание, когда события действительно срабатывают). –

+0

события не замедляют ваше приложение точно. укажите ссылку, чтобы я мог рассмотреть дело. но это не события, которые замедляют работу, если они не написаны совершенно зрелым способом, например, имеют «бесконечное» количество элементов DOM и придают им тысячи событий. который, конечно же, не был бы здравомыслящим человеком. – vsync

Смежные вопросы