Подтвердить что ты не робот

JQuery: нажатие одной кнопки, однократное нажатие на событие

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Предложение

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

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

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

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

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

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

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

Но самое главное, это СУХОЕ Плагин/Эффект Framework, позволяющий вам гораздо легче разрабатывать плагины и расширения. Поэтому надеюсь, что это поможет достичь этой цели!

Ответ 4

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

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

    //some exception-throwing code here
});

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

Ответ 5

Вы можете использовать $("div").one("click", function() { ... });

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

jquery.com

Ответ 6

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

$(".class-name").unbind().click(function() {
    //Do the Stuff
});

Ответ 7

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

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

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

Ответ 8

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

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