Wie Sie verhindern, dass der Aufruf von de-Ereignisprozedur zweimal auf schnelle Klicks?
Gibt es einen Knopf und wenn der Benutzer klickt auf den button, werden einige Daten gespeichert mit back-end. Problem ist, wenn der Benutzer klickt auf den button sehr schnell, event-handler wird immer ausgeführt, mehrere Male.
Dies ist der code
var x = 1;
$('#button').click(function() {
//Do something
//Save some data on network
x++;
console.log(x);
});
Ich möchte dieser Prozedur, die ausgeführt werden, wenn der Benutzer klickt auf die Schaltfläche nur einmal. Auch Bei doppelt oder dreifach klicken, dies sollte nur einmal ausgeführt. Ich möchte nur vermeiden, Klicks, diese Prozedur kann ausgeführt werden, wieder natürlich
Habe ich mehrere Lösungen im Kopf wie
-
Definieren Sie eine Globale variable wie
IS_BUTTON_HANDLER_WORKING = false
und wenn Sie den hf setzen Sie ihn auf true und am Ende auf false gesetzt wieder. Und prüfen Sie, ob es wahr ist, einfach aus der Funktion zurückzugeben. -
Trennen der hf am Anfang und wieder am Ende.
Betrachten Sie 25 Tasten in der Anwendung. Was sollte der beste Ansatz, um dies zu implementieren.
Werfen Sie einen Blick auf diese Fiddle
Lösung
$('#button').click(function() {
$(this).attr('disabled', true);
//Do something
//Save some data on network
$(this).removeAttr('disabled');
});
Mit dieser, wir sind sicher, dass unsere nächsten handler wird ausgeführt, nur bei der vorherigen Ausführung wurde völlig geschafft.
- Versuchen Sie es mit
one('click', fn)
stattclick
- Ich glaube nicht, dass
one
ist die richtige Antwort, weil der handler nicht ausgeführt werden, wieder. Möchten Sie vielleicht zum senden des Formulars mit aktualisierten Daten wieder nach einiger Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
David Walsh hat einen großen Lösung.
Gibt es mehrere Möglichkeiten, damit umzugehen:
Können Sie
disable
/hide
den button nach dem Klick:Können Sie auch ein Zeitlimit auf jeder klicken Sie, um sicherzustellen, dass es nicht erneut ausführen:
Also jedes mal, wenn die Schaltfläche geklickt wird, wird es eigentlich nur den code auszuführen, nachdem ein
1000 milliseconds
wenn die Schaltfläche geklickt wird, in der raschen Folge, das timeout wird einfach gelöscht und wieder von vorne anfangen.beachten Sie, dass die oben ist ungetestet
Ich persönlich denke, die Behinderten-Lösung ist die beste, weil es zeigt dem Benutzer an, dass er geklickt hat und etwas passiert ist, Sie kann sogar zeigen ein loader neben der Taste als auch.
Any global variable
odersetinterval
-> Macht den code etwas komplexer.Als pro Bearbeiten
Sollten Sie verwenden .ein()
oder
Können Sie
unbind
Ereignis on click FunktionKönnen Sie Gebrauch machen von jQuery ein() Methode, wie dargestellt hier
Ich bin mit der einfachen Lösung unten, und es funktioniert für mich gut :
Du suchst diese
Oder, wenn u brauchen ein gewisses Zeitintervall zu verfallen zwischen zwei effektive Klicks.
JS:
HTML:
Können Sie entfernen Sie einen listener bei mehreren in java-script wie oben.
Versuchen Sie den folgenden code
Vorausgesetzt, Sie befestigt und Ereignis-listener auf die Schaltfläche, ein Ansatz ist, um einfach entfernen Sie den Ereignis-listener vom button und befestigen Sie es später erneut, wenn nötig.
In der Ereignis-listener-Funktion selbst fügen Sie den folgenden code:
Je nach Ihrem setup, das funktionieren könnte.