jQuery: pojedyncze kliknięcie przycisku, kliknięcie zdarzenia dwa lub więcej razy

Mam wejście HTML i elementy przycisków. Używam przycisków do przesyłania formularzy, otwierania okien dodatkowych itp. Problem polega na tym, że jedno kliknięcie zamienia się w 2 (a czasami wiele więcej) zgłoszenia formularzy lub otwiera dwa dodatkowe okna przeglądarki. Odtworzyłem problem w wielu przeglądarkach internetowych. Próbowałem zmienić wersje jQuery i to nic nie zmieniło. Co może powodować takie rzeczy?

Author: gholmes, 2010-01-24

8 answers

Twój problem może wystąpić, ponieważ przypisujesz tę samą funkcję obsługi zdarzenia click wiele razy. Sugeruję sprawdzić, czy linia, do której przypisujesz handler, nie jest wywoływana wielokrotnie przypadkowo. Innym rozwiązaniem może być wywołanie unbind (deprecated 3.0) lub off (superseeded) first:

$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded
Ale nie widząc jakiegoś kodu, zgaduję.
 83
Author: Darko Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 06:16:48

Biorąc pod uwagę, że nie podałeś zbyt wielu informacji, najlepsze, co mogę polecić, to spojrzenie na jedną ()

Http://api.jquery.com/one/

 13
Author: Jarrett Widman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-24 18:43:56

JQuery Sparkle zapewnia czyste, eleganckie rozwiązanie tego problemu, wywołując funkcję "once" możesz powiązać obsługę zdarzenia tylko raz.

Jest to ważna poprawa w stosunku do sugestii Darko Z jako użycie:

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

Usunie wszystkie inne procedury obsługi "kliknięć" powiązane z zdarzeniem" Kliknij " za każdym razem, gdy jest ono wywołane. Więc na pewno upewnij się, że jest wiązany tylko raz, jednak Wszystko inne przypadkowo odpiąć! Ooops!

Sugestia Jarretta rozpina obsługę "kliknięcia" zaraz po wywołaniu, więc jeśli chcesz mieć wywołany handler ponownie (po jego początkowym pożarze), będziesz musiał ponownie zainstalować handler.

Użycie jQuery Sparkle ' s once pozwoli handlerowi odpalić tyle razy, ile potrzebuje, ale tylko raz, a nie kilka razy. Możesz go używać w ten sposób:

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

Lub jeśli chcesz obsługiwać dane w wywołaniu zwrotnym, tak jak wbudowany w jQuery "bind", możesz użyć:

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

Możesz znaleźć kod źródłowy dla definiowanie funkcji once tutaj .

Jest to open source na licencji AGPL, więc możesz czuć się swobodnie, aby pobrać to, czego potrzebujesz z niego bezproblemowo! :- ) Jest również aktywnie rozwijany na co dzień, więc nigdy nie zabraknie wsparcia.

Ale co najważniejsze jest to suchy Plugin / Effect Framework, aby umożliwić Ci tworzenie wtyczek i rozszerzeń znacznie łatwiej. Więc mam nadzieję, że pomoże to osiągnąć ten cel!

 8
Author: balupton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-10 19:29:38

Dla mnie to było spowodowane

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

    //some exception-throwing code here
});

JQuery dwukrotnie wywoływał funkcję Anonymous ready(?!) ze względu na wyjątek funkcja kliknięcia byłaby związana dwukrotnie.

 6
Author: Walf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 02:37:05

Możesz użyć one():

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

Dołącz obsługę do zdarzenia dla elementów. Funkcja obsługi jest wykonywana co najwyżej raz dla każdego elementu.

 4
Author: gkiko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 06:19:48

To zadziała dobrze. U mnie działa.

$(".class-name").unbind().click(function() {
    //Do the Stuff
});
 3
Author: Riyadh Ul Islam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-20 16:19:08

Wywołanie czegoś takiego zanim zadziałało u mnie, ponieważ pierwotnie użyłem $('#myButton').on ('klik'... aby przydzielić moich słuchaczy.

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

Dokumentacja dla " off();"

 1
Author: Tessa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 19:21:51

Miałem problem z modalnymi oknami dialogowymi. Zdarzenie wywołane raz za każdym razem, gdy otworzyłem okno dialogowe w sesji. Nie ma problemu na pierwszym oknie, wystrzelił dwa razy na drugim oknie, wystrzelił trzy razy na trzecim oknie, itp.

Zauważyłem, że funkcja inicjalizacji okna dialogowego była wywoływana za każdym razem, gdy otwierałem nowe okno dialogowe w tej samej sesji. Dodałem globalną zmienną notInit = -1 i przy uruchomieniu init przypisałem wartość do 1. Sprawdziłem wartość notInit przed uruchomieniem funkcji init i przeszedł z init tylko wtedy, gdy wartość była -1.

 1
Author: MsTapp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 15:10:22