Ответ 1
Я думаю, что это больше связано с личными предпочтениями и читаемостью кода.
Чем мощнее идет .on
, вы можете делегировать события, когда ярлыки всегда работают с элементом напрямую. Например, $('body').on('click', '.button', function(){});
будет работать для каждого элемента .button
даже тех, которые добавлены после факта с помощью ajax или иным образом. Хотя ярлык не может сделать это, $('.button').click(function(){});
- единственный способ добавить слушателя к .button
и не имеет делегирования, поэтому элементы .button
, добавленные позже, не будут иметь этого связывания.
Прямые не делегированные события (например, ярлыки) для нескольких элементов также немного менее эффективны, чем делегированные события на родительском объекте. Например: допустим, что на странице есть 15 .button
элементов, $('.button').click(...
будет циклически перебирать все 15 элементов и добавлять к ним прослушиватель событий; однако $('#parentElem').on('click', '.button', ...
просто присоединяет один прослушиватель событий к #parentElem
, который проверяет цель, поэтому один подключаемый и один прослушиватель, а также цикл и 15 слушателей.
И, наконец, .on
имеет то преимущество, что вы можете присоединить функцию к элементу из нескольких событий, что невозможно с помощью ярлыков, например: $('.button').on('click mouseover keyup', ...
функция будет запускаться с помощью щелчка, мыши или клавиатуры!
Давайте еще раз скажем, что в div называется 15 .button
элементов, называемых #parent
Ярлык:
$('.button').click(turnRed);
$('.button').mouseover(turnRed);
$('.button').keyup(turnRed);
function turnRed(){
$(this).css('color','red');
}
- Создано 4 объекта jQuery (да, я знаю, вы можете кэшировать его на 2 объекта, но это пример)
- 3 элемента цикла по 15 каждый, поэтому jQuery хитов здесь 45 раз и прикрепляет слушателей.
- 45 слушателей всех событий
- Будущие элементы
.button
, добавленные в сцену, неturnRed
.on
обработчик:
$('#parent').on('click mouseover keyup', '.button', turnRed);
function turnRed(){
$(this).css('color','red');
}
- Созданы 2 созданных объекта jQuery.
- Нет цикла элементов, поэтому jQuery удаляет элементы один раз
- 3 слушателя всех событий
- Будущие элементы
.button
, добавленные в сцену, фактически будутturnRed
Здесь .on
явно имеет преимущество
Если ваша ситуация проще, то преимущество .on
может не повлиять на вас, и ярлык может быть более предпочтительным, поскольку его более читаемый.
$('#button').click(...
почти идентичен $('#button').on('click', ...
(см. ответ @Fabrício Matté), и если мы просто хотим добавить один прослушиватель к одному событию, то сила .on
- спорная точка.
Лично потому, что есть моменты, когда мне нужно преимущество .on
, я всегда использую .on
только для того, чтобы быть последовательным.