1

У меня есть сайт/приложение jQueryMobile, в котором производительность является проблемой. Я читаю много о том, как разумно не связывать слишком много отдельных обработчиков. Так что если у вас есть страница с большим количеством кнопок, совет, чтобы связать как это ...Могу ли я улучшить производительность jQuery, объединив все события одного типа в один обработчик?

$(document).on('click',function(){ 
    if (this = $('#button1')){ 
     //Handler for button one 
    } else if (this = $('#button2') { 
     //etc 
    } else //etc 
}) 

... а не как это ...

$('#button1').click(function(){ 
    //Handler for button one 
}) 
$('#button2').click(function(){ 
    //Handler for button two 
}) 
//etc 

Так что я интересно насколько это действительно полезно.

Что делать, если я сделал один слушатель для всех событий 'pageshow' в моем документе? (веб-сайт jQueryMobile представляет собой единый документ, содержащий много страниц, и многие из этих страниц нуждаются в небольшом количестве показов).

Что делать, если я сделал один клик для всех сорока с лишних кнопок в документе и использовал обработчик, чтобы отличить, с какой кнопкой мы имеем дело, и что нужно сделать в ответ?

+0

Почему бы не запустить несколько тестов на JSPerf? – j08691

+0

«jQueryMobile ... производительность - проблема» jQueryMobile - это раздутая часть дерьма, которая замедляет ваш сайт на порядок. Используйте DOM прямо – Raynos

ответ

4

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

Если у вас были сотни кнопок со всей почти идентичной обработкой событий, может возникнуть смысл только установить один обработчик событий для всех из них, а не запускать код для установки сотен обработчиков событий. Но вы по-прежнему будете платить небольшое штрафное вознаграждение, когда произойдет определенное событие.

Если вы хотите максимально оптимизировать время выполнения во время события, то еще быстрее установить обработчик событий на конкретный объект, который вы хотите контролировать. Это связано с тем, что обработчики событий хранятся в отдельном списке только для этого объекта, и код не должен сортировать длинный список обработчиков событий, чтобы найти, какой из них подходит для этого конкретного объекта и события.

Кроме того, оператор if в первом варианте никогда не будет работать по нескольким причинам. Он должен был бы быть что-то вроде этого:

$(document).on('click',function(e) { 
    if (e.target.id == 'button1') { 
     //Handler for button one 
    } else if (e.target.id == 'button2') { 
     //etc 
    } 
}) 

И, в любое время вы используете делегированного обработку событий, то лучше выбрать общий родительский для кнопок, что гораздо ближе к реальным объектам, чем document объекта (помогает выполнения представление).

$("#buttonContainer").on('click',function(e) { 
    if (e.target.id == 'button1') { 
     //Handler for button one 
    } else if (e.target.id == 'button2') { 
     //etc 
    } 
}) 

Если вы хотите только щелчков кнопок с обработкой делегированных событий, вы можете использовать некоторые из delgation функций, встроенной в .on() как этот

$("#buttonContainer").on('click', 'button', function(e) { 
    if (this.id == 'button1') { 
     //Handler for button one 
    } else if (this.id == 'button2') { 
     //etc 
    } 
}) 
+0

Привет jFriend, спасибо за ваш ответ (Да, мой первый пример не сработает). Я понимаю, что я не совсем понял суть функции .on() и ее возможность делегирования. Вы говорите своим ответом, что лучше всего привязывать каждую кнопку напрямую с помощью $ ('# buttonX'). On ('click', function() {}), чем связывать каждую кнопку с делегацией как в $ ('body'). on ('click', '# buttonX', function() {})? – Wytze

+0

@Wytze - Пожалуйста, перечитайте параграфы два и три в моем ответе. «Лучше» зависит от расположения вашей страницы и того, на что вы пытаетесь оптимизировать. Я объяснил компромиссы в первых параграфах. – jfriend00

+0

Hi jFriend, извините, что не выбрал это. Я хочу оптимизировать общую отзывчивость кликов и нажатий на кнопки и ссылки. С одной стороны, мне кажется, что я должен свести к минимуму количество активных слушателей (всех видов, поскольку любой слушатель сказывается на производительности). С другой стороны, может случиться так, что сведение к минимуму количества слушателей (через делегирование) вызывает большую задержку, ожидая появления пузырька для ближайшего общего родителя. – Wytze

1

Рекомендация: использовать event delegation. Фактически вам не нужно связывать этот «мастер-обработчик событий» с document или document.body, вы можете (и должны) привязать его к ближайшему возможному узлу, который разделяют все кнопки.

$('#ClosestSharedParent').on('click', 'button', function(event) { 
    // "this" references the button that was actually clicked 
    switch(event.id) { 
     case 'button1': 
      alert('button1 clicked'); 
      break; 
     case 'button2': 
      alert('button2 clicked'); 
      break; 
     // and so on 
    } 
}); 

Второй аргумент .on() принимает селектор, в котором можно указать, какие элементы вы хотите делегировать события для. В более старой версии jQuery это было выполнено с помощью метода .delegate().

Ref .: .one(), .delegate()

+0

Спасибо jAndy! В моей ситуации jQueryMobile один тип событий может возникать на элементах во многих разных «страницах», и все эти исходные родители всех этих страниц являются телами, поэтому в этом случае я буду придерживаться тела. – Wytze

+0

Вам не нужно связывать (и не должно) его с возможным узлом. Просто привяжите его к «документу» и используйте фазу захвата. Кроме того, почему привязывает его к ближайшей родительской помощи? – Raynos

+0

@Raynos: потому что вы можете предотвратить события от дальнейшего распространения. – jAndy

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

  • Нет связанных вопросов^_^