Submit Abbrechen über XAJAX

meilon

Erfahrenes Mitglied
Hallo,

für mein Projekt konnte ich XAJAX schon einige mal einsetzten, denn meiner Meinung nach ist es das beste für PHP Programmierer ausgelegte AJAX Framework.

Jetzt bin ich an einem Punkt angelangt, wo ich wohl auf die Grenzen von AJAX stoße bzw. mir ein Aspekt der JavaScript Programmierung unbekannt ist:

Ich habe eine Form, in der unter anderem ein Datum eingegeben werden soll. Wenn man auf den Submit-Button drückt wird beim onclick Ereignis folgendes ausgeführt:
Code:
return checkStatForm();
Sollte checkStatForm() false zurückgeben, wird der Submitvorgang abgebrochen. Nur daran hapert es noch:
Code:
var statErrors = false;
function checkStatForm() {
  xajax_checkStatForm(xajax.getFormValues('statSelection'));
  if(statErrors == true) {	
	return false;
  }
}
Mit dem XAJAX-Aufruf werden die Formulardaten an den Server gesendet, welcher die dann überprüft und dann die Ergebnisse zurück sendet. Auch das funktioniert tadellos, so werden zum Beispiel die fehlerhaften Felder rot hinterlegt.
Nur wird der vom Server gesandte JavaScript-Befehl
PHP:
$objResponse->script('statErrors = true;');
nicht rechtzeitig umgesetzt.
Wenn ich aus dem Submit-Input ein Button-Input mache, werden die XAJAX-Befehle umgesetzt. Wenn es ein Submit ist, passiert nichts, da der Browser (Firefox) schon den echten Submitvorgang durchgeführt hat.

Habe ich irgendetwas übersehen? Versuche ich irgendetwas unmögliches? Gibt es einen Workaround?

Grüße
meilon
 
Wenn ich das nun hier richtig betrachte , hast Du ein Formular dieses willst über Ajax an den Server senden und es dort auswerten lassen und nicht über den herkömmlichen weg , dies betrifft auch die Entertaste in einen Input Feld dann oder der <input type="submit">..</input>

Dieses Standardverhalten kannst blocken mit :

Code:
   document.formname.onsubmit = function () { return false;}
 
Naja, direkt den Vorgang blocken möchte ich nicht. Auch mit der Entertaste soll das Formular weiterhin absendbar sein (sofern der Server sagt, die Daten sind Okay). Das Problem ist, das Javascript einfach weiter macht, ohne zu warten, bis der vorherige Befehl vollständig ausgeführt worden ist. Und auf das Beenden soll gewartet werden, ein setTimeout ist entweder zu lang wenn der User aus dem Intranet zugreift oder zu kurz, wenn er über sein Handy auf die Plattform zugreift.

Da ich den Code erstmal bis zum 9.1.2008 nicht vor meinen Augen haben werde, kann ich mit deiner Zeile nicht rumspielen.

Wenn es am Ende nicht geht, werde ich darauf verzichten müssen, aber so schnell gebe ich nicht auf :D
 
Also über diese Zeile

Code:
   formname.onsubmit = function () { return false; }


verhinderst jegliches standard Absenden was der Browser kennt , aber wenn ich das nun richtig verstanden habe willst nun die Formular daten erst an den Server senden , dieser überprüft es dann kommt es zurück es ist alles okay dann sende es endlich komplett ab.

Formulare kann man aber nachträglich immer noch absenen über form.submit() das ganze kann man sich gut zu nutze machen.

Es tritt ja ein Event ein onSubmit , da vertrauen wir erstmal keinen und geben Prinzipiell false zurück.

Nun prüfen wir das Script durch in dem wir es an den Server senden , und die Rückruf Funktion entscheidet dann ob das Formular gesendet werden kann oder nicht.

Im groben Beispiel ganz ohne Ajax aber einer Art fake , verzögern wir im Script mal einfach die Antwort um 5 sec.

Testweise hab ich das mal so bei mir eingebunden :

Code:
<html>
    <head>
        <script type="text/javascript">
            function fakeajax (callback) {
                
                // 5 sec Pause mal nun und dann rufen wir die interner Funktion getRequest auf
                window.setTimeout(getRequest,5000);
                
                function getRequest() {
                    // Zufallswert ermitteln 1 == alles okay 0 == irgend was ist schief gelaufen 
                    var stringvalue = (Math.round(Math.random()) == 1)?"alles okay":"ups fehler";
                     // callback funktion aufrufen und Server Antwort übermitteln 
                    callback.call(callback,stringvalue);
                }                
            }
        
            window.onload = function () {
                testform.onsubmit = function () {        
                    //aktuelles formular Object speichern
                    var formobject = this;
                    
                    //ajax request starten  naja den Fake Request mal
                    // und übergeben noch die Callback funktion die er aufrufen soll wenn er fertig ist
                    fakeajax(validateForm);
                    
                    // Rückruf vom Ajax mit dem String als Rückgabe Wert oder den Rückgabe Werten
                    function validateForm(rv) {
                        if(rv == 'alles okay')
                            formobject.submit(); // sollte alles okay sein senden wir das Formular ab
                        else 
                            alert("ein Fehler ist aufgetreten"); // ansonsten passiert gar nix weiter
                    }
                    return false;
                }
            }
        </script>
    </head>
    <body>
        <form name="testform" action="formtester.php?foo=bar" method="post">
            <input type="text" name="hallowelt"></input>
            <input type="submit"></input>
        </form>
    </body>
</html>

Getestet nun im IE 7.0 , FF und Opera alles andere weiss ich nun nich genau ;) , der wichtige teil ist sicher der form.onsubmit = function () { code} dann.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück