Разница между .on ('click') и .click () - PullRequest
492 голосов
/ 03 февраля 2012

Есть ли разница между следующим кодом?

$('#whatever').on('click', function() {
     /* your code here */
});

и

$('#whatever').click(function() {
     /* your code here */
});

Ответы [ 11 ]

719 голосов
/ 09 августа 2012

Я думаю, разница в моделях использования.

Я бы предпочел .on вместо .click, потому что первый может использовать меньше памяти и работать с динамически добавляемыми элементами.

Рассмотрим следующий html:

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

, где мы добавляем новые кнопки через

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

и хотим "Alert!"чтобы показать предупреждение.Для этого мы можем использовать «клик» или «вкл».


Когда мы используем click

$("button.alert").click(function() {
    alert(1);
});

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

  1. много совпадающих элементов создаст много идентичных обработчиков и, следовательно, увеличит объем памяти
  2. динамически добавленные элементы не будут иметь обработчика - т.е. в вышеупомянутом html вновь добавленные элементы "Оповещать!»кнопки не будут работать, если вы не перепривязаете обработчик.

Когда мы используем .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

с вышеприведенным, обработчик single для все элементы , соответствующие вашему селектору, в том числе созданные динамически.


... еще одна причина для использования .on

Как прокомментировал Adrien ниже, еще одна причинаиспользовать .on в пространстве имен событий.

Если вы добавляете обработчик с .on("click", handler), вы обычно удаляете его с помощью .off("click", handler), который удаляет этот самый обработчик.Очевидно, это работает, только если у вас есть ссылка на функцию, а что, если у вас ее нет?Вы используете пространства имен:

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

с отменой привязки через

$("#element").off("click.someNamespace");
35 голосов
/ 03 февраля 2012

Есть ли разница между следующим кодом?

Нет, функциональных различий между двумя примерами кода в вашем вопросе нет..click(fn) - это «быстрый способ» для .on("click", fn).Из документации для .on():

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

. Обратите внимание, что .on() отличается от .click() тем, что имеет возможность создавать делегированные .обработчики событий путем передачи параметра selector, тогда как .click() - нет.Когда .on() вызывается без параметра selector, он ведет себя точно так же, как .click().Если вы хотите делегировать события, используйте .on().

21 голосов
/ 03 февраля 2012

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

Как вы уже написали в своем примере, между ними нет различий.Оба связывают обработчик с событием click #whatever.on() предлагает дополнительную гибкость, позволяя вам делегировать события, инициируемые потомками #whatever, в одну функцию-обработчик, если вы выберете.

// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });
18 голосов
/ 03 февраля 2012

Как уже упоминалось в других ответах:

$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })

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

(И, очевидно, существуют другие похожие методы ярлыков для «keyup», «focus» и т. Д.)

Причина, по которой я публикую дополнительный ответ, состоит в том, чтобы упомянутьчто произойдет, если вы вызовете .click() без параметров:

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");

Отметив, что если вы используете .trigger() напрямую, вы также можете передавать дополнительные параметры или объект события jQuery, который вы не можете сделать с помощью .click().

Я также хотел упомянуть, что если вы посмотрите на исходный код jQuery (в jquery-1.7.1.js), вы увидите, что внутренне это .click() (или .keyup() и т. Д.).) функция на самом деле вызовет .on() или .trigger().Очевидно, это означает, что вы можете быть уверены, что они действительно имеют тот же результат, но это также означает, что использование .click() имеет чуть-чуть больше накладных расходов - не о чем беспокоиться или даже думать в большинстве случаев, но теоретически это может иметь значение вчрезвычайные обстоятельства.

РЕДАКТИРОВАТЬ: Наконец, обратите внимание, что .on() позволяет привязать несколько событий к одной и той же функции в одной строке, например:

$("#whatever").on("click keypress focus", function(){});
9 голосов
/ 03 февраля 2012

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

8 голосов
/ 03 февраля 2012

Они кажутся одинаковыми ... Документация от функции click () :

Этот метод является ярлыком для .bind ('click', handler)

Документация от функции on () :

Начиная с jQuery 1.7, метод .on () обеспечивает всю необходимую функциональность для прикрепления обработчиков событий. За помощь в конвертации из старого jQuery методы событий, см. .bind (), .delegate () и .live (). Удалить события связан с .on (), см .off ().

7 голосов
/ 29 ноября 2016

.click события работают только при визуализации элемента и прикрепляются только к элементам, загруженным, когда DOM готов.

.on события динамически присоединяются к элементам DOM, что полезно, если вы хотитеприкрепить событие к элементам DOM, которые отображаются по запросу ajax или как-то еще (после того, как DOM готов).

4 голосов
/ 16 апреля 2018

Здесь вы получите список различных способов применения события click.Вы можете выбрать соответственно подходящий или, если ваш клик не работает, просто попробуйте альтернативный вариант из них.

2 голосов
/ 22 декабря 2018

Теперь они устарели click (), так что лучше всего продолжать с ('click')

1 голос
/ 01 декабря 2017

Насколько ilearned из Интернета и некоторых друзей .on () используется, когда вы динамически добавляете элементы. Но когда я использовал его на простой странице входа, где событие click должно отправить AJAX в node.js, а при возврате добавить новые элементы, он начал вызывать вызовы multi-AJAX. Когда я изменил его, чтобы щелкнуть () все прошло правильно. На самом деле я не сталкивался с этой проблемой раньше.

...