Я начал эту проблему в понедельник 2018-06-04. Наши тесты проводятся каждый будний день. Похоже, что единственное, что изменилось, это версия google-chrome (которая была обновлена до текущей). JVM и Selenium были последними версиями на Linux-боксе (Java 1.8.0_151, selenium 3.12.0, google-chrome 67.0.3396.62 и Xvfb перспектива). В частности, добавление аргументов «--no-sandbox» и «--disable-dev-shm-usage» остановило ошибку. Я рассмотрю эти проблемы, чтобы найти дополнительную информацию об эффекте и другие вопросы, как в том, что вызвало обновление google-chrome.
ChromeOptions options = new ChromeOptions();
...
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
Я думаю, разница в шаблонах использования.
Я предпочел бы .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);
});
с указанным выше, обработчик раздельный создается для каждого отдельного элемента , который соответствует селектору. Это означает, что
.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");
Что касается ilearned из Интернета и некоторых друзей .on () используется, когда вы динамически добавляете элементы. Но когда я использовал его на простой странице входа, где событие click должно отправить AJAX на node.js, а при возврате добавить новые элементы, он начал вызывать вызовы с несколькими AJAX. Когда я изменил его, нажмите () все пошло правильно. На самом деле я не сталкивался с этой проблемой раньше.
Они выглядят одинаково ... Документация из функции click () :
Этот метод является ярлыком для .bind ('click', обработчик)
blockquote>Документация из функции on () :
Как и в jQuery 1.7, метод .on () обеспечивает все функции, необходимые для прикрепления обработчиков событий. Для получения помощи в преобразовании из старых методов событий jQuery см. .Bind (), .delegate () и .live (). Чтобы удалить события, связанные с .on (), см. .Off ().
blockquote>
$ ('. UPDATE'). click (function () {}); V / S $ (document) .on ('click', '. UPDATE', function () {});
[введите описание изображения здесь] [10]
Есть ли разница между следующим кодом?
blockquote>Нет, нет функциональной разницы между двумя примерами кода в вашем вопросе.
.click(fn)
- это «метод быстрого доступа» для.on("click", fn)
. Из документация для.on()
:Существуют короткие методы для некоторых событий, таких как
blockquote>.click()
, которые можно использовать для присоединения или обработчиков событий триггера.Обратите внимание, что
.on()
отличается от.click()
тем, что имеет возможность создавать делегированных обработчиков событий , передав параметрselector
, тогда как.click()
этого не делает. Когда.on()
вызывается без параметраselector
, он ведет себя точно так же, как.click()
. Если вы хотите делегировать событие, используйте.on()
.
.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() { ... });
Здесь вы получите список различных способов применения события click. Вы можете выбрать соответственно подходящий или если вы нажмете не работает, попробуйте альтернативу из них.
$('.clickHere').click(function(){
// this is flat click. this event will be attatched
//to element if element is available in
//dom at the time when JS loaded.
// do your stuff
});
$('.clickHere').on('click', function(){
// same as first one
// do your stuff
})
$(document).on('click', '.clickHere', function(){
// this is diffrent type
// of click. The click will be registered on document when JS
// loaded and will delegate to the '.clickHere ' element. This is
// called event delegation
// do your stuff
});
$('body').on('click', '.clickHere', function(){
// This is same as 3rd
// point. Here we used body instead of document/
// do your stuff
});
$('.clickHere').off().on('click', function(){ //
// deregister event listener if any and register the event again. This
// prevents the duplicate event resistration on same element.
// do your stuff
})
Как уже упоминалось в других ответах:
$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })
Отметив, что .on()
поддерживает несколько других комбинаций параметров, которые .click()
не позволяет, обрабатывая делегирование событий (superceding .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()
имеет немного меньшие накладные расходы - ничто не беспокоится или даже не думает об этом в большинстве случаев, но теоретически это может иметь значение в чрезвычайные обстоятельства.
EDIT: Наконец, обратите внимание, что .on()
позволяет связать несколько событий с одной и той же функцией в одной строке, например:
$("#whatever").on("click keypress focus", function(){});
Нет, нет. Точка on()
- это другие ее перегрузки и возможность обрабатывать события, которые не имеют методов быстрого доступа.
.click
события работают только тогда, когда элемент получает визуализацию и прикрепляются только к элементам, загружаемым, когда DOM готов.
.on
события динамически привязаны к элементам DOM, что полезно, когда вы хотите для присоединения события к элементам DOM, которые отображаются в запросе ajax или что-то еще (после того, как DOM готов).