jQuery: нажатие одной кнопки, срабатывание события клика два или более раз - PullRequest
30 голосов
/ 24 января 2010

У меня есть элементы ввода HTML и кнопки. Я использую кнопки для отправки форм, открытия дополнительных окон и т. Д. Проблема в том, что один клик превращается в 2 (а иногда и многие другие) отправки форм или открывает два дополнительных окна браузера. Я воспроизвел проблему в нескольких веб-браузерах. Я пытался переключать версии JQuery, и это ничего не изменило. Что может быть причиной такого рода вещей?

Ответы [ 8 ]

83 голосов
/ 24 января 2010

Возможно, ваша проблема возникает из-за того, что вы назначаете один и тот же обработчик событию click несколько раз. Я предлагаю вам проверить, что строка, которой вы назначаете обработчик, не вызывается случайно несколько раз. Другим решением может быть вызов unbind (устаревший 3.0) или off (замененный) первым:

$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded

Но, не видя некоторого кода, я просто догадываюсь.

13 голосов
/ 24 января 2010

Учитывая, что вы не предоставили много информации, лучшее, что я могу порекомендовать, это взглянуть на один ()

http://api.jquery.com/one/

8 голосов
/ 16 июля 2010

jQuery Sparkle обеспечивает чистое элегантное решение для этого, вызвав функцию «один раз», вы можете привязать обработчик к событию только один раз.

Это важное улучшение по сравнению с предложением Дарко Z:

$("#myButton").unbind("click").click(myHandler);

При каждом вызове отменяет привязку любых других обработчиков «щелчка», связанных с событием «щелчка». Таким образом, вы уверены, что убедитесь, что это только один раз, однако вы случайно удалили все остальное! По электронной почте Ой!

Предложение Джарретта отменяет привязку обработчика «click» сразу после его вызова, поэтому, если вы хотите, чтобы обработчик вызывался снова (после его первоначального запуска), вам придется перепривязать обработчик.

Использование jQuery Sparkle один раз позволит обработчику запускать столько раз, сколько ему нужно, но его можно связывать только один раз, а не несколько раз. Вы можете использовать это так:

$('#myButton').once('click', function(){
    // my handler
});

Или, если вы хотите поддерживать данные в вашем обратном вызове так же, как встроенный в jQuery «bind», вы можете использовать:

$('#myButton').once('click', data, function(){
    // my handler
});

Вы можете найти исходный код для определения функции раз здесь .

Это открытый исходный код под лицензией AGPL, так что вы можете свободно выбирать из него то, что вам нужно, без проблем! :-) Он также активно развивается изо дня в день, поэтому у вас никогда не будет недостатка в поддержке.

Но самое главное, это DRY Plugin / Effect Framework, который позволяет вам гораздо легче разрабатывать плагины и расширения. Надеюсь, это поможет достичь этой цели!

6 голосов
/ 15 декабря 2010

для меня это было вызвано

$(function() {
    $('.some-element').click(function() {
        //event that fires twice
    });

    //some exception-throwing code here
});

jQuery вызывал анонимную функцию готовности дважды (?!) из-за исключения, поэтому функция click будет связана дважды.

4 голосов
/ 24 декабря 2012

Вы можете использовать one():

$("div").one("click", function(e) { ... });

Прикрепить обработчик к событию для элементов. Обработчик выполняется не более одного раза для каждого элемента.

3 голосов
/ 20 февраля 2016

Это будет хорошо работать. Это работает для меня.

$(".class-name").unbind().click(function() {
    //Do the Stuff
});
1 голос
/ 05 мая 2016

У меня была проблема с модальными диалоговыми окнами. Событие запускалось один раз за каждый раз, когда я открывал диалог в сеансе. Нет проблем с первым окном, дважды сработало во втором окне, сработало три раза с третьим окном и т. Д.

Я обнаружил, что функция инициализации для диалога вызывается каждый раз, когда я открывал новое диалоговое окно в том же сеансе. Я добавил глобальную переменную notInit = -1 и присвоил значение 1 при запуске init. Я проверил значение notInit перед запуском функции init и продолжил с init только если значение было -1.

1 голос
/ 13 июля 2015

Вызов чего-то подобного до того, как это сработало для меня, так как я первоначально использовал $ ('# myButton'). On ('click' ..., чтобы назначить моих слушателей.

$('#myButton').off();

Документация для "off ();"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...