Ich habe diese Frage gefunden, aber sie wurde nicht beantwortet: Gibt es ein jQuery-Ereignis, das ich überwachen kann, wenn die Formularübertragung abgebrochen wird?
Also, wenn der Benutzer ein Formular übermittelt, während es lädt den Benutzer gedrückt "esc", oder klicken Sie auf "Stop" des Browsers, möchte ich eine Funktion aufrufen, ist es möglich?
Hinweis: Ich weiß, dass wir den "esc" -Button binden können, aber was ist, wenn der Benutzer die Übertragung durch den "stop / cancel" -Button des Browsers gestoppt hat?
Gibt es eine JavaScript oder Jquery mögliche Lösung?
BEARBEITEN:
Ich weiß, dass wir mit diesem Problem mit XHR (json / ajax) Post umgehen können, aber ich suche nach einer normalen Formularübermittlung.
Ich versuche einfach Folgendes zu erreichen: Wenn der Benutzer die Schaltfläche "Senden" drückt, möchte ich die Schaltfläche "Senden" deaktivieren. Wenn der Benutzer die Übertragung während des Ladevorgangs abbrach / stoppte, wird die Übermittlungsschaltfläche weiterhin deaktiviert (sollte wieder aktiviert werden, wenn die Übertragung abgebrochen / gestoppt wurde).
Bearbeiten / Umformulieren - 16. Dez. 2013:
Mein Problem ist ähnlich dem: Gibt es ein jQuery-Ereignis, das ich überwachen kann, wenn die Formularübertragung abgebrochen wird?
Zum Beispiel habe ich dieses Formular:
%Vor%Hier ist das Problemszenario:
Ein Neuling füllt das Formular aus und klickt dann doppelt auf die Senden-Schaltfläche. Die gleichen Formularwerte werden zweimal in den Server eingefügt!
Versuch zu erreichen:
Ich möchte die Schaltfläche "Senden" bei Klick mit $('#submitbtn').bind('click', function() { $(this).attr('disabled','disabled'); $(this).prop('disabled', true); });
deaktivieren, was das Problem löst, aber ein weiteres Problem verursacht: Wenn der Benutzer auf "esc" geklickt oder den Browser gestoppt hat, während das Formular noch gesendet wird, wäre der Absenden-Button immer noch deaktiviert und der Benutzer kann das Formular nicht mehr senden. Ich möchte den Absenden-Button erneut aktivieren, sobald der "Übermittlungsprozess" abgebrochen wird. Gibt es einen Weg, dies zu erreichen? Etwas wie: $(window).onStop(function() { ... });
? oder eine Möglichkeit, anzugeben, dass der Übermittlungsprozess unterbrochen wurde (oder noch läuft)?
Anmerkungen:
Letztendlich bricht diese Frage das komplexe Problem tatsächlich auf und kann so in Teilen behandelt werden, wie es sein sollte. Lasst uns zuerst den Elefanten aus dem Raum holen:
Ich habe das tatsächlich eine Weile durchgesehen und konnte nicht herausfinden, wie es geht, aber vielleicht kann jemand eine Antwort darauf geben und uns beide erleuchten. Lass uns jetzt den zweiten Elefanten aus dem Raum holen.
Es ist eine Tatsache, dass wir in der Lage sind, Dinge zu tun, während eine Anfrage bearbeitet wird, was asynchron heißt (wie das erste "A" in "Ajax"). Lass uns den 3. Elefanten sehen
Das Deaktivieren von Schaltflächen ist natürlich die einfachste Lösung in diesem Dilemma. Wir erfassen das Senden und fügen eine Zeile ein, um weitere Sendeereignisse aus diesem Formular zu deaktivieren. Erledigt. Kann der nächste Elefant hereinkommen?
Problem , der Benutzer weiß es nicht (und er sollte es wirklich nicht wissen müssen), wenn der Server bereits vollständige Header hat und die Anfrage verarbeitet. Der Server kann überwachen, ob der Client abgebrochen wurde, aber ...
Jetzt hat Ihr Problem eine Menge großer Löcher, die dadurch verschlimmert werden, dass Sie NICHT möchten, dass Ihre Anfragen ASYNCHRON sind, und es gibt KEINE Möglichkeit, browser.onStop
zuverlässig zu hören.
Denken Sie die Dinge anders.
Sie haben Angst vor Inkonsistenzen. Lösung: Deaktivieren Sie die Übertragungsereignisse nach dem ersten
Ihre Benutzer sind dumm / unerfahren. Lösung: großes rotes Etikett Warning: do not press the stop button during the process, or navigate away from the page until the request has completed
.
Ihre Benutzer sind besorgt. Lösung: Fügen Sie einen Vorbehalt You may edit your post/info in another page once the request has completed. (some instructions to find the edit page)
Ihr Server (oder die langsame Verbindung) dauert zu lange, und der Benutzer kann ungeduldig sein. Lösung: Legen Sie ein Timeout-Ereignis fest, bevor Sie die Übertragung auslösen, die ... ist, aber warten Sie! Die Anforderung lautet Synchron , was bedeutet, dass bis zum Ende nichts anderes mehr möglich ist. Dear User: this process may take a while. If after X mins you have not been redirected to this/page.html please... (do something/more instructions)
Nehmen Sie all diese Ratschläge und beginnen Sie mit Ajax, wenn Sie ein höheres Maß an Interaktivität wünschen, informieren Sie Ihre Benutzer über die Gefahren beim Versuch, Anfragen abzubrechen, und geben Sie ihnen Optionen zur späteren Bearbeitung.
Befolgen Sie Beispiele anderer Dienste. Viele Unternehmen warnen bei Zahlungsvorgängen sehr stark, seien Sie geduldig, bis der Prozess abgeschlossen ist, und fügen Sie einige Anweisungen hinzu, falls etwas schief geht und der Benutzer sich Sorgen macht.
Erwägen Sie, die Interaktivität mit Einschränkungen zu versehen, einige Prozesse sind nur nicht interaktiv (Zahlungen, eindeutige Einträge ...)
Wenn Sie befürchten, dass sich ein Benutzer auf einem deaktivierten Formular verirrt, fügen Sie ihm einige Informationen hinzu. If you tried to stop the procedure please follow this link to see if it was processed, if it wasn't you will be redirected to this form again (you may want to save the users form data so he doesn't have to start over)
Internet Explorer verfügt über ein Ereignis "document.stop", das ausgelöst wird, andere Browser scheinen dies jedoch nicht zu unterstützen. Beachten Sie, dass es ausgelöst wird, wenn der Benutzer auf Stopp klickt oder ESC drückt ODER wenn der Benutzer während des Ladens der Seite zu einer anderen Seite navigiert, was den gleichen Effekt hat.
Ich glaube nicht, dass es eine zuverlässige Möglichkeit gibt, ein Ereignis auszulösen, wenn Sie in anderen Browsern auf "Stop" klicken. Vielleicht wäre es möglich, etwas zu tun: die Verbindung zum Server offen zu halten (wie im Comet-Ansatz), eine Art Keep-Alive durch die Verbindung zu streamen und festzustellen, ob der Stream endet (wie ich annehme, wenn Stopp-Taste wurde geklickt).
Von: Jedes Javascript-Ereignis, das auftritt, wenn der Nutzer klickt Schaltfläche "Laden beenden"?
Ich habe meine Antwort auf den Kommentar hanzo2001
in seiner Frage gesetzt:
"Die ganze Idee verhindert, dass der Benutzer auf den" Senden "-Button klickt mehr als einmal, damit der Benutzer nicht zweimal oder mehrmals dasselbe Formular einreicht. "
Dann könnten Sie möglicherweise ein wasNeverSubmitted
Flag haben und es nach dem ersten Senden des Formulars auf true setzen.
Schließlich würden Sie dieses Flag für jedes Formular überprüfen, wenn es wahr ist, dann brechen Sie die Formularübergabe ab, sehen Sie, wie Sie dies in dieser Frage tun. Deaktivieren Sie die Übermittlungsfunktionalität für alle Formulare auf einer HTML-Seite
Der Code würde ungefähr wie folgt aussehen:
HTML:
%Vor%Javascript (erfordert jQuery):
%Vor%Tags und Links javascript jquery event-handling