Manchmal, wenn die Antwort langsam ist, kann man mehrmals auf die Schaltfläche "Senden" klicken.
Wie kann dies verhindert werden?
javascript
submit
Oh mein Gott
quelle
quelle
Antworten:
Verwenden Sie unauffälliges Javascript, um das Übermittlungsereignis im Formular zu deaktivieren, nachdem es bereits übermittelt wurde. Hier ist ein Beispiel mit jQuery.
BEARBEITEN: Problem beim Senden eines Formulars ohne Klicken auf die Schaltfläche "Senden" behoben. Danke, ichiban.
quelle
return true
? Ich denke, die erste Einreichung sollte ohne das funktionieren.return true
ist impliziert, wenn es weggelassen wird.$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
Ich habe die Lösung von vanstee zusammen mit der unauffälligen Validierung von asp mvc 3 ausprobiert. Wenn die Client-Validierung fehlschlägt, wird der Code weiterhin ausgeführt und das Senden von Formularen ist endgültig deaktiviert. Ich kann nach Korrektur der Felder nicht erneut einreichen. (siehe Kommentar von bjan)
Also habe ich Vanstees Skript folgendermaßen geändert:
quelle
Die clientseitige Kontrolle der Formularübermittlung kann sehr elegant erreicht werden, indem der Onsubmit-Handler die Übermittlungsschaltfläche ausblendet und durch eine Ladeanimation ersetzt. Auf diese Weise erhält der Benutzer sofort visuelles Feedback an derselben Stelle, an der seine Aktion (das Klicken) stattgefunden hat. Gleichzeitig verhindern Sie, dass das Formular ein anderes Mal gesendet wird.
Wenn Sie das Formular über XHR senden, beachten Sie, dass Sie auch Übermittlungsfehler behandeln müssen, z. B. eine Zeitüberschreitung. Sie müssten die Schaltfläche "Senden" erneut anzeigen, da der Benutzer das Formular erneut senden muss .
In einem anderen Punkt bringt llimllib einen sehr gültigen Punkt vor. Alle Formularüberprüfungen müssen serverseitig erfolgen. Dies beinhaltet mehrere Übermittlungsprüfungen. Vertraue niemals dem Kunden! Dies ist nicht nur dann der Fall, wenn Javascript deaktiviert ist. Sie müssen berücksichtigen, dass der gesamte clientseitige Code geändert werden kann. Es ist schwer vorstellbar, aber das mit Ihrem Server sprechende HTML / Javascript ist nicht unbedingt das von Ihnen geschriebene HTML / Javascript.
Generieren Sie das Formular, wie von llimllib vorgeschlagen, mit einem für dieses Formular eindeutigen Bezeichner und fügen Sie es in ein verstecktes Eingabefeld ein. Speichern Sie diese Kennung. Beim Empfang von Formulardaten werden diese nur verarbeitet, wenn die Kennung übereinstimmt. (Verknüpfen Sie den Bezeichner auch mit der Benutzersitzung und stimmen Sie ihn aus Sicherheitsgründen ebenfalls ab.) Löschen Sie den Bezeichner nach der Datenverarbeitung.
Natürlich müssen Sie von Zeit zu Zeit die Kennungen bereinigen, für die nie Formulardaten übermittelt wurden. Aber höchstwahrscheinlich verwendet Ihre Website bereits eine Art "Garbage Collection" -Mechanismus.
quelle
quelle
<form onsubmit="return (typeof submitted == 'undefined') ? (submitted = true) : !submitted">
oder schreiben Sievar submitted = false;
an der richtigen Stelle Ihres Skripts, um den folgenden Fehler zu vermeiden :Uncaught ReferenceError: submitted is not defined
.Hier ist eine einfache Möglichkeit, dies zu tun:
quelle
Deaktivieren Sie die Senden-Schaltfläche kurz nach einem Klick. Stellen Sie sicher, dass Sie die Validierungen ordnungsgemäß durchführen. Behalten Sie außerdem eine Zwischenseite für alle Verarbeitungs- oder DB-Vorgänge bei und leiten Sie dann zur nächsten Seite weiter. Dadurch wird sichergestellt, dass beim Aktualisieren der zweiten Seite keine weitere Verarbeitung durchgeführt wird.
quelle
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
Hash die aktuelle Zeit, mache es zu einer versteckten Eingabe im Formular. Überprüfen Sie auf der Serverseite den Hash jeder Formularübermittlung. Wenn Sie diesen Hash bereits erhalten haben, erhalten Sie eine wiederholte Übermittlung.
Bearbeiten: Sich auf Javascript zu verlassen ist keine gute Idee, daher können Sie alle diese Ideen weiter abstimmen, aber einige Benutzer haben sie nicht aktiviert. Die richtige Antwort ist, Benutzereingaben auf der Serverseite nicht zu vertrauen.
quelle
Sie können auch einen Fortschrittsbalken oder einen Drehfeld anzeigen, um anzuzeigen, dass das Formular verarbeitet wird.
quelle
Mit JQuery können Sie Folgendes tun:
&
quelle
Ich weiß, dass Sie Ihre Frage mit "Javascript" markiert haben, aber hier ist eine Lösung, die überhaupt nicht von Javascript abhängt:
Es ist ein Webapp-Muster namens PRG , und hier ist ein guter Artikel , der es beschreibt
quelle
Sie können das mehrfache Senden einfach verhindern mit:
quelle
Workin =true;
. Doppelte Einreichungen sind weiterhin möglich, aber weniger wahrscheinlich.Die einfachste Antwort auf diese Frage lautet: "Manchmal, wenn die Antwort langsam ist, kann man mehrmals auf die Schaltfläche" Senden "klicken. Wie kann dies verhindert werden?"
Deaktivieren Sie einfach die Schaltfläche zum Senden von Formularen, wie im folgenden Code angegeben.
Die Schaltfläche "Senden" wird beim ersten Klicken zum Senden deaktiviert. Auch wenn Sie einige Validierungsregeln haben, funktioniert dies einwandfrei. Hoffe es wird helfen.
quelle
Auf der Clientseite sollten Sie die Schaltfläche "Senden" deaktivieren, sobald das Formular mit Javascript-Code wie der von @vanstee und @chaos bereitgestellten Methode gesendet wurde.
Es gibt jedoch ein Problem mit Netzwerkverzögerungen oder Situationen mit deaktiviertem Javascript, in denen Sie sich nicht auf JS verlassen sollten, um dies zu verhindern.
Also, auf der Server-Seite , sollten Sie die wiederholte Einreichung von den gleichen Kunden überprüfen und lassen die man wiederholt , die einen falschen Versuch , von dem Benutzer scheint.
quelle
Sie können das Safeform JQuery Plugin ausprobieren.
quelle
Die einfachste und eleganteste Lösung für mich:
Link für mehr ...
quelle
Verwenden Sie diesen Code in Ihrem Formular. Es werden mehrere Klicks verarbeitet.
es wird sicher funktionieren.
quelle
Dies ermöglicht das Senden alle 2 Sekunden. Im Falle einer Frontvalidierung.
quelle
Der beste Weg, um die Übermittlung mehrerer zu verhindern, besteht darin, einfach die Schaltflächen-ID in der Methode zu übergeben.
quelle
Dies mit Javascript zu tun ist etwas einfach. Es folgt der Code, der die gewünschte Funktionalität bietet:
quelle
Die einfachste Lösung besteht darin, die Schaltfläche beim Klicken zu deaktivieren und nach Abschluss des Vorgangs zu aktivieren. So überprüfen Sie eine ähnliche Lösung auf jsfiddle:
Und Sie können eine andere Lösung für diese Antwort finden .
quelle
Das funktioniert sehr gut für mich. Es sendet die Farm und macht die Schaltfläche deaktiviert und nach 2 Sekunden aktiv die Schaltfläche.
In ECMA6 Syntex
quelle
Nur um die möglichen Antworten zu ergänzen, ohne die Validierung der Browsereingaben zu umgehen
quelle
Eine Alternative zu dem, was zuvor vorgeschlagen wurde, ist:
quelle