Jquery: Wie behandelt man das Ereignis "stop / cancel", wenn der Benutzer das Senden abbricht?

8

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:

  • Suche nach Client-Seite (Javascript oder Jquery) Lösung. Ich weiß, dass es leicht mit der serverseitigen Überprüfung auf identische Einträge gelöst werden kann, aber ich bin nicht an einer serverseitigen Lösung interessiert.
  • Problem kann mit XHR (ajax / json) Bindings (wie onSuccess, onFailure, etc) gelöst werden .. aber in diesem Fall benutze ich einen normalen Post, nicht XHR, also bitte XHR von Ihrer Antwort ausschließen.
  • Lösung muss das Problem mindestens für die 5 wichtigsten Browser (IE, FF, Chrome, Safari, Opera) lösen.
  • Jemand kann vorschlagen, dass wir "keypress" für die "esc" -Taste binden, also wenn der Benutzer "esc" drückt, aktivieren wir die Submit-Taste erneut. Das ist gut, aber das ist eine halbe Lösung. Was ist, wenn der Benutzer den "Übermittlungsprozess" mit der Stopp-Schaltfläche des Browsers beendet hat, gibt es eine Möglichkeit, anzugeben, dass diese Stopp-Schaltfläche angeklickt wurde?
evilReiko 13.12.2013, 18:51
quelle

3 Antworten

5

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:

  • Es gibt keine Cross-Browser-Lösung, die erkennt, wenn der Benutzer eine Stopp- / (Ref) -Taste drückt

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.

  • Keine Ajax-Anfragen erlaubt (aus irgendeinem Grund). Sobald der Benutzer den Submit-Button gedrückt hat und das eigentliche Submit-Ereignis ausgelöst wird, sind wir STUCK

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

  • Ich habe dumme / unerfahrene / clickety-clackeyy / missbraucher Benutzer, die aus Versehen Inkonsistenzen auf dem Server erzeugen können (zB: unerwünschte Duplikate). Wir sollten einen Mechanismus bereitstellen, der ein solches Ereignis verhindert.

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?

  • Der Prozess hat begonnen, der Benutzer sieht die Fortschrittsanzeige sich drehen und merkt, dass er gerade versaut ist. Er will es stoppen, HÖLLE! Er muss es stoppen.

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 ...

  • Der Benutzer hat die Stopp-Taste gedrückt! Hat der Server die Anfrage bearbeitet? Hat der Server es gelöscht? Sind meine Daten in der Datenbank angekommen? Oh, jetzt habe ich eine behinderte Form, die ich nicht mehr benutzen kann, und ich weiß nicht, ob das, was ich getan habe, Konsequenzen hatte. Wie wäre es mit einer Aktualisierung?

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.

Meine Antwort

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)

  • hinzu
  • 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)

hanzo2001 14.12.2013, 11:06
quelle
0
  

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"?

    
JAKEtheJAB 13.12.2013 20:14
quelle
0

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%     
Adrien Be 15.09.2014 09:23
quelle