Есть ли разница между следующим кодом?
$('#whatever').on('click', function() {
/* your code here */
});
а также
$('#whatever').click(function() {
/* your code here */
});
Я думаю, разница в моделях использования.
Я бы предпочел .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);
});
и хочу "Оповещение!" чтобы показать предупреждение. Для этого мы можем использовать «клик» или «вкл».
click
$("button.alert").click(function() {
alert(1);
});
с вышеупомянутым, отдельный обработчик создается для каждого отдельного элемента, который соответствует селектору. Это значит
.on
$("div#container").on('click', 'button.alert', function() {
alert(1);
});
с вышеупомянутым, один обработчик для всех элементов, которые соответствуют вашему селектору, включая те, которые созданы динамически.
.on
Как прокомментировал Adrien ниже, еще одна причина использовать .on
это события в пространстве имен.
Если вы добавляете обработчик вместе с .on("click", handler)
вами, обычно удаляйте его, .off("click", handler)
и этот обработчик удаляется. Очевидно, это работает, только если у вас есть ссылка на функцию, а что, если у вас ее нет? Вы используете пространства имен:
$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });
с привязкой через
$("#element").off("click.someNamespace");
on('click' ...)
, см. stackoverflow.com/a/3973060/759452 т.е.on('click.darkenallothersections' ...)
и в то же время иметьon('click.displaynextstep' ...)
, то я могу отменить привязку только тот, который я выбрал, используя.unbind('click.displaynextstep')
on()
это тенденция в JQuery. Мне пришлось обновляться$(window).load(function() {});
до того$(window).on("load", function (e) {})
момента, когда я обновился до jQuery 3.Нет, между двумя примерами кода в вашем вопросе нет функциональной разницы.
.click(fn)
является «методом ярлыка» для.on("click", fn)
. Из документации для.on()
:Обратите внимание, что
.on()
отличается от того,.click()
что он имеет возможность создавать делегированные обработчики событий путем передачиselector
параметра, тогда как.click()
нет. Когда.on()
вызывается безselector
параметра, он ведет себя точно так же, как.click()
. Если вы хотите делегировать события, используйте.on()
.источник
selector
параметра. Если вы звоните.on()
безselector
параметра, производительность не улучшится по сравнению с использованием.click()
..on()
это рекомендуемый способ сделать все привязки вашего события начиная с jQuery 1.7. Он объединяет все функциональные возможности обоих.bind()
и.live()
в одну функцию, которая изменяет поведение при передаче различных параметров.Как вы написали свой пример, между ними нет никакой разницы. Оба связывают обработчик с
click
событием#whatever
.on()
предлагает дополнительную гибкость, позволяя вам делегировать события, инициируемые потомками,#whatever
в одну функцию-обработчик, если вы выберете.источник
.live()
делает? Кроме того, это, кажется, противоречит другим ответам, которые говорят, что он имеет только функциональность.click()
, и, следовательно, не относится к будущим событиям..on()
может делать то, что.click()
делает, и делать,.bind()
и.live()
делать - это зависит от того, с какими параметрами вы его называете. (Некоторые другие ответы тоже упоминали об этом.) Обратите внимание, что «Привязать ко всем ссылкам внутри #whwhat» - это не то.live()
, что делает, это то, что.delegate()
делает..live()
связывает все внутри,document
а не позволяет вам указать контейнер. Примечание также.live()
не рекомендуется с jQuery 1.7 и далее.Как уже упоминалось в других ответах:
Однако следует отметить, что он
.on()
поддерживает несколько других комбинаций параметров, которые.click()
не поддерживают его, что позволяет ему обрабатывать делегирование событий (superceding.delegate()
и.live()
).(И, очевидно, существуют другие похожие методы ярлыков для «keyup», «focus» и т. Д.)
Причина, по которой я публикую дополнительный ответ, состоит в том, чтобы упомянуть, что происходит, если вы звоните
.click()
без параметров:Отмечая, что если вы используете
.trigger()
напрямую, вы также можете передавать дополнительные параметры или объект события jQuery, с которым вы не можете делать.click()
.Я также хотел упомянуть, что если вы посмотрите на исходный код jQuery (в jquery-1.7.1.js), вы увидите, что внутренне функция
.click()
(или.keyup()
, и т. Д.) Будет фактически вызывать.on()
или.trigger()
. Очевидно, это означает, что вы можете быть уверены, что они действительно имеют тот же результат, но это также означает, что использование.click()
имеет немного больше накладных расходов - не о чем беспокоиться или даже думать в большинстве случаев, но теоретически это может иметь значение в чрезвычайных обстоятельствах.РЕДАКТИРОВАТЬ: Наконец, обратите внимание, что
.on()
позволяет привязать несколько событий к одной и той же функции в одной строке, например:источник
.click()
.)Нет, нет
Суть
on()
его других перегрузок и способности обрабатывать события, которые не имеют ярлыков.источник
Они выглядят одинаково ... Документация от функции click () :
Документация от функции on () :
источник
.click
vs.on
.click
события работают только когда элемент визуализируется и прикрепляются только к элементам, загруженным, когда DOM готов..on
события динамически присоединяются к элементам DOM, что полезно, если вы хотите прикрепить событие к элементам DOM, которые отображаются по запросу ajax или как-то еще (после того, как DOM готов).источник
Здесь вы получите список различных способов применения события click. Вы можете выбрать соответственно как подходящий или, если ваш клик не работает, просто попробуйте альтернативу из них.
источник
Теперь они устарели click (), так что лучше всего продолжать с ('click')
источник
Насколько ilearned из Интернета и некоторых друзей .on () используется, когда вы динамически добавляете элементы. Но когда я использовал его на простой странице входа, где событие click должно отправить AJAX в node.js, а при возврате добавить новые элементы, он начал вызывать вызовы multi-AJAX. Когда я изменил его, чтобы щелкнуть () все прошло правильно. На самом деле я не сталкивался с этой проблемой раньше.
источник
НОВЫЕ ЭЛЕМЕНТЫ
В качестве дополнения к подробным ответам выше, чтобы выделить критические точки, если вы хотите, чтобы щелчок прикреплялся к новым элементам:
источник
$(document).on('click','.UPDATE',function(){ });
эффективно работает как те же извлекаемые данные с использованием jquery. кнопка не работает во время обновления или удаления:источник