Возникает ли производительность, если я прикрепляю .on('click' события к $( "body" )?
В настоящее время у меня есть следующий код:
$('#loginLink, #registerLink').click(function () {
dialog(this);
return false;
});
$('#detailData')
.on('click', '.modalDeleteLink, .modalEditLink', function () {
dialog(this);
return false;
})
Есть только один из #loginLink и #registerLink, но может быть до ста элементов с классами .modalDeleteLink и .modalEditLink.
Я думал изменить все эти элементы, чтобы они имели класс .dialogLink, а затем просто использовали следующий код:
$("body").on("click", ".dialogLink", function(){
dialog(this);
return false;
});
Этот код намного проще поддерживать. Однако может ли быть какой-либо недостаток в производительности, связанный с этим телом?
Ответы
Ответ 1
Вам не нужно беспокоиться о производительности, если у вас нет сотен обработчиков или чрезвычайно большого документа.
Извлечь из документация:
В большинстве случаев событие , такое как клик, происходит редко, а производительность не представляет существенной проблемы.. Однако высокочастотные события, такие как mousemove или scroll, могут срабатывать десятки раз в секунду, и в этих случаях становится более разумным использовать события разумно. Производительность может быть увеличена за счет сокращения объема работы, выполняемой самим обработчиком, кэширования информации, необходимой обработчику, а не пересчета ее или путем ограничения количества фактических обновлений страниц с помощью setTimeout.
Прикрепление многих делегированных обработчиков событий в верхней части дерева документов может ухудшить производительность. Каждый раз, когда происходит событие, jQuery должен сравнивать все селекторы всех присоединенных событий этого типа с каждым элементом пути от целевой цели до вершины документа. Для обеспечения максимальной производительности присоединяйте делегированные события в местоположении документа как можно ближе к целевым элементам. Избегайте чрезмерного использования документа или документа .body для делегированных событий на больших документах.
Ответ 2
В jQuery, чем выше вы помещаете .on() в DOM, тем медленнее будет. Это связано с тем, что jQuery должен сравнивать все селекторы всех вложенных событий выбранного типа с целевым уровнем документа.
Смотрите страницу документации jQuery для .on():
Прикрепление многих делегированных обработчиков событий в верхней части дерева документов может ухудшить представление. Каждый раз, когда происходит событие, jQuery должен сравнивать все селекторы всех прикрепленные события этого типа к каждому элементу пути от целевой цели до вверху документа. Для обеспечения максимальной производительности присоедините делегированные события в месте расположения документа как можно ближе к целевым элементам. Избегайте чрезмерного использования документа или document.body для делегированных событий в крупных документах.
С учетом сказанного разница в производительности может быть незначительной для событий щелчка, поскольку, в отличие от прокрутки или событий перемещения мыши, они запускаются нечасто (только при нажатии пользователем).