Зачем использовать jQuery on() вместо click()

В настоящее время с jQuery, когда мне нужно что-то делать при нажатии Click, я сделаю это вот так...

$(".close-box").click( function() {
    MoneyBox.closeBox();
    return false;
});

Я смотрел какой-то код, который у кого-то еще есть в проекте, и они делают это вот так...

$(".close-box").live("click", function () {
    MoneyBox.closeBox();
    return false;
});

Заметьте, что это похоже на то же, насколько я могу сказать, за исключением того, что они используют функцию live(), которая теперь устарела, и jQuery docs говорят использовать on() вместо этого, но в любом случае, зачем использовать live/on() вместо моего первого примера?

Ответ 1

Поскольку у вас могут быть динамически сгенерированные элементы (например, исходящие из вызова AJAX), вы можете захотеть иметь тот же обработчик кликов, который ранее был привязан к тому же селектору элементов, тогда вы делегируете событие click с помощью on() с аргументом селектора

Чтобы продемонстрировать:

http://jsfiddle.net/AJRw3/

on() также может быть синонимом click(), если у вас нет указателя выбора:

$('.elementClass').click(function() { // code 
});

является синонимом

$('.elementClass').on('click', function() { // code
});

В том смысле, что он только добавляет обработчик один раз ко всем элементам с классом elementClass. Если у вас появился новый elementClass, например $('<div class="elementClass" />'), обработчик не будет привязан к этому новому элементу, вам нужно сделать:

$('#container').on('click', '.elementClass', function() { // code
});

Предполагая, что #container является .elementClass предком

Ответ 2

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

Использование click() является псевдонимом bind('click' ...). Использование bind() принимает DOM так же, как и когда прослушиватель событий настраивается и привязывает функцию к каждому из соответствующих элементов в DOM. То есть, если вы используете $('a').click(...), вы привяжете функцию, предоставленную к событию click каждого тэга привязки в DOM, найденном при запуске этого кода.

Использование live() было старым способом в jQuery; он был использован для связывания событий, как это делает bind(), но он не просто связывает их с элементами в DOM при запуске кода - он также прослушивает изменения в DOM и связывает события с любыми согласованными в будущем элементами как Что ж. Это полезно, если вы выполняете манипуляции с DOM, и вам нужно, чтобы какое-то событие существовало на некоторых элементах, которые могут быть удалены/обновлены/добавлены в DOM позже, но не существуют, когда DOM впервые загружен.

Причина, по которой live() теперь обесценивается, состоит в том, что она плохо реализована. Чтобы использовать live(), вы должны были сначала выбрать хотя бы один элемент в DOM (я полагаю). Это также привело к тому, что копия функции запускается для привязки к каждому элементу - и если у вас есть 1000 элементов, то много скопированных функций.

Создание функции on() состояло в том, чтобы преодолеть эти проблемы. Он позволяет привязать одного прослушивателя событий к объекту, который не будет изменен в DOM (поэтому вы не можете использовать on() для элемента, который будет удален/добавлен в DOM позже - привяжите его к родительскому объекту), и просто примените элемент "filter", чтобы функция запускалась только тогда, когда она была пузырьковата до элемента, соответствующего селектору. Это означает, что у вас есть только одна функция, которая существует (а не куча копий), привязанная к одному элементу - гораздо лучший подход к добавлению "живых" событий в DOM.

... и вот что такое различия и почему каждая функция существует и почему live() обесценивается.

Ответ 3

  • $("a").live() → Он будет применяться ко всем <a>, даже если он создан после вызова.
  • $("a").click() → Он будет применяться ко всем <a> до того, как это будет вызвано. (Это сокращение от bind() и on() в 1.7)
  • $("a").on() → Предоставляет все функции, необходимые для прикрепления обработчиков событий. (Новый в jQuery 1.7)

Цитаты:

Как и в jQuery 1.7, метод .live() устарел. Используйте .on() для присоединения обработчиков событий. Пользователи более ранних версий jQuery должны использовать .delegate() в предпочтении .live().
Этот метод предоставляет возможность прикреплять делегированные обработчики событий к элементу документа на странице, что упрощает использование обработчиков событий при контенте динамически добавляется на страницу. См. Обсуждение прямых и делегированных событий в методе .on() для получения дополнительной информации.

Метод .on() привязывает обработчики событий к выбранному в данный момент набору элементов в объекте jQuery. Начиная с jQuery 1.7, метод .on() предоставляет все функции, необходимые для прикрепления обработчиков событий.

Для более ранних версий метод .bind() используется для привязки обработчика события непосредственно к элементам.

Ответ 4

click() является ярлыком для метода не делегирования on(). Итак:

$(".close-box").click() === $(".close-box").on('click')

Делегировать события с помощью on(), т.е. в динамически созданных объектах вы можете сделать:

$(document).on('click', '.close-box') // Same as $('.close-box').live()

Но on() вводит делегирование в любом статическом элементе, а не только document как live(), так:

$("#closestStaticElement").on('click', '.close-box')

Ответ 5

Вы должны прочитать разницу между live и bind.

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

Напротив, обработчики, прикрепленные через bind (и его ярлыки, например click), прикрепляют обработчики непосредственно к элементам DOM, соответствующим селектору, и поэтому связаны только с существующими элементами.

Следствием гибкости live является снижение производительности, поэтому используйте ее только тогда, когда вам нужны функции, которые она предоставляет.

Ответ 7

Когда вам нужно привязать некоторые обработчики событий к dynamically added elements, вы должны использовать live (устаревший) или on, чтобы он работал. Просто $('element').click(...); не будет работать с любым динамически добавленным элементом в DOM.

Подробнее о Разница между jQuerys.bind(),.live() и .delegate().

Ответ 8

$. click() - это просто ярлык для привязки или включения. Из документов jQuery:

В первых двух вариантах этот метод является ярлыком для .bind("click", обработчик), а также для .on("click", обработчик) по jQuery 1.7. В третьем варианте, когда .click() вызывается без аргументов, это ярлык для .trigger("click").

Ответ 9

Метод .on() прикрепляет обработчики событий к выбранному в данный момент набору элементов в объекте jQuery. Метод click() связывает обработчик события с событием "click" JavaScript или запускает это событие для элемента.

В обычном .click(..., если цель селектора изменяется "на лету" (например, через некоторый ответ ajax), вам нужно будет снова назначить поведение.

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

Ответ 10

В методе on обработчик событий прикрепляется к родительскому элементу вместо целевого.

пример: $(document).on("click", ".className", function(){});

В приведенном выше примере обработчик события привязки прикреплен к документу. И он использует событие bubbling, чтобы узнать, кто-то нажал на целевой элемент.