Im Anschluss an eine vorherige Frage , in der ich gefragt habe, ob ich einen Absenden-Button deaktivieren soll, bis alle Ajax-Anrufe beendet sind ...
Es scheint, dass die Leute es schaffen, das Formular auch bei deaktivierter Schaltfläche und einem Warnzeichen zu übermitteln. Ich denke, es könnte von 'Enter' in einer Texteingabe drücken.
Wie gehe ich vor, das ganze Formular zu deaktivieren, anstatt nur den Absenden-Button?
Der Code ist so weit:
%Vor%Eine andere Sache, die ich erwähnen sollte, die ein Problem verursachen könnte, ist, dass es mehrere Ajax-Aufrufe gleichzeitig gibt, zB ein div erhält versteckte Eingaben und ein anderes div an anderer Stelle auf der Seite zeigt zum Beispiel einen Preis / p>
Würde die Tatsache, dass einige Ajax-Aufrufe abgeschlossen sind, schnell den behindernden Effekt von ajaxStart zunichte machen? EG ajax call1 und ajax call2 feuern beide den ajaxStart - call1 beendet sich sehr schnell, würde es das Formular wieder aktivieren, während wir darauf warten, dass call2 beendet wird?
Gibt es einen besseren Weg, dies zu tun, wo wir einfach testen könnten, ob ALLE Ajax-Aufrufe abgeschlossen sind?
Sie können einen Ereignishandler für das Sendeereignis des Formulars hinzufügen. Der Event-Handler kann prüfen, ob die Übermittlung noch zulässig ist, und abbrechen, wenn dies nicht der Fall ist. Hier einige Dokumente: Ссылка
Beachten Sie, dass, wenn JavaScript auf der Seite die .click () -Funktion für eine der Schaltern zum Senden von Formularen aufruft, das Formular ohne Aufruf der Prozedur .submit () übergeben wird. Dies ist ein seltsames jQuery-Problem ( Ссылка ), das ich denke, die jQuery Leute betrachten keinen Fehler. Es kann andere Fälle wie diesen geben, hoffe ich nicht.
Wenn Sie ASP.NET verwenden, kann ASP.NET je nach dem, was auf dem Formular steht, eine "__doPostBack" -Funktion einfügen. Möglicherweise müssen Sie diese Funktion stattdessen anhängen, indem Sie sie mit einem benutzerdefinierten Code neu definieren, der das Original aufruft.
Sie könnten einfach ein JS-Objekt mit mehreren Eigenschaften für jeden Ajax-Aufruf festlegen. Beispiel:
%Vor%Bei der Formularübergabe durchlaufen Sie jede Eigenschaft, um nach "True" zu suchen. Wenn irgendwelche falsch sind, reichen Sie das Formular nicht ein.
Wenn jeder Ajax-Aufruf abgeschlossen ist, setze seine Eigenschaft (call1, call2, usw.) auf true.
Das ist eine Möglichkeit, wie Sie es tun könnten, ob es der beste Weg ist, ich weiß es nicht.
Wie wäre es mit der Erstellung einer globalen Variablen:
%Vor%und jeder AJAX-Aufruf inkrementiert diese Variable zu Beginn des Aufrufs und dekrementiert sie nach Abschluss.
Überprüfen Sie beim Übergeben des Formulars, ob diese Variable größer als 0 ist und verhindern Sie das Senden.
%Vor%Ich habe das fast gelöst, aber irgendwie scheinen die Leute immer noch in der Lage zu sein, das Formular einzureichen, bevor die Rückrufe beendet sind.
Ich weiß nicht, ob es Zufall ist, aber all die Leute, die es geschafft haben, es zu verwenden, haben Safari auf Mac benutzt.
Hier ist die Methode, die ich verwende, wäre großartig, wenn jemand den Fehler in der Logik erkennen könnte.
Mit Vincents Vorschlag:
%Vor%Wenn ich zum Beispiel einen Ajax-Aufruf mache:
%Vor%Das funktioniert gut, ich habe auch ein nettes kleines Skript, um dem Benutzer Feedback zu geben - der Button ist ausgegraut, während er darauf wartet, dass die Ajaxzähler zurückkommen und wenn es länger als 250ms dauert, wird auch eine Animation angezeigt. Sobald alle Ajax-Anrufe abgeschlossen sind, ist der Zähler wieder auf Null und die Schaltfläche wird wie üblich angezeigt:
%Vor%Schließlich kommen wir zu der Funktion, die die Einreichung verhindern sollte, aber scheinbar nicht funktioniert:
%Vor%Kann jemand sehen, was ich hier falsch gemacht habe?
Danke!
Tags und Links jquery ajax forms validation