AJAX: Rückgabewert von Callback-Handler
daniel_h
- javascript
Hallo,
ich mache gerade meine ersten Gehversuche mit AJAX und möchte zum Einstieg gern ein einfaches Login-Formular serverseitig validieren (jaja, ich weiß per GET - ist nur zum Testen und Ausprobieren gedacht).
Mit einem onSubmit rufe ich eine entsprechende Funktion auf:
<form action="login.php" method="POST" enctype="multipart/form-data" name="loginform" onSubmit="return ajax_validate(this.login,this.password)">
Diese Funktion setzt meinen AJAX-Request dann ab:
function ajax_validate(user,pass) {
if(XMLHTTP.readyState==4 || XMLHTTP.readyState==0) {
XMLHTTP.open("GET","login_validation.php?user="+user.value+"&pass="+pass.value);
XMLHTTP.onreadystatechange = cb_handle_login;
XMLHTTP.send(null);
}
}
genau DIESE ^^ Funktion müßte aber jetzt doch ein FALSE oder TRUE zurückgeben, um das Absenden des Formulars ggf. zu verhindern, oder nicht? Aber was die Überprüfung der User-Eingaben ergibt, das weiß ich ja erst, nachdem ich die Atwort vom Server habe, die von meinem Callback-Handler cb_handle_login() gehandelt wird? Wie bekomme ich also einen Rückgabewert von cb_handle_login() in ajax_validate() um das Absenden des Login-Formular ggf. zu verhindern?
Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt... ;-)
Vielen Dank für eure Hilfe,
Grüße,
Daniel
P.S.: Bitte versucht es für Anfänger zu erklären - JS bzw. Ajax sind nicht unbedingt so sehr meine Spezialgebiete ;-) Danke!
n'abend,
genau DIESE ^^ Funktion müßte aber jetzt doch ein FALSE oder TRUE zurückgeben, um das Absenden des Formulars ggf. zu verhindern, oder nicht? Aber was die Überprüfung der User-Eingaben ergibt, das weiß ich ja erst, nachdem ich die Atwort vom Server habe, die von meinem Callback-Handler cb_handle_login() gehandelt wird? Wie bekomme ich also einen Rückgabewert von cb_handle_login() in ajax_validate() um das Absenden des Login-Formular ggf. zu verhindern?
das erste A in AJAX steht für Asynchronous. Asynchron bedeutet, dass du deine Anfrage abschickst, dein Script ganz normal weiter läuft und wenn eine Antwort auf deine Anfrage eingetroffen ist, wird eine sogenannte Callback-Funktion ausgeführt.
Du musst also umdenken. Dein ajax_validate() muss false zurückgeben, damit das Formular nicht abgeschickt wird. In deiner Callback-Funktion cb_handle_login() reagierst du dann entsprechend auf die Antwort des Servers. Wenn du auf eine andere Seite weiterleiten möchstest, kannst du das bspw. mit location.href = 'duBistEingeloggt.php';
machen.
Mich irritiert die Abfrage if(XMLHTTP.readyState==4 || XMLHTTP.readyState==0)
vor dem Absetzen des (Login-)Requests etwas. Was bezweckst du hiermit? Bzw. wie schaut der restliche Code dazu aus?
weiterhin schönen abend...
Hi,
im Grunde genommen arbeitet mein kleines Script ja wie folgt:
1. Nach dem Klick auf den Submit-Button werden die Daten validiert
2. a) Daten sind valide, User wird angemeldet, eine Session wird gestartet oder
b) Daten nicht valide, Fehlermeldung anzeigen
Ich hätte jetzt gedacht, die Validierung erfolgt per AJAX und im Anschluss wird das Formular entweder "ganz normal" abgeschickt ODER eine das Abschicken wird unterbunden und stattdessen eine Fehlermeldung angezeigt.
Du musst also umdenken. Dein ajax_validate() muss false zurückgeben, damit das Formular nicht abgeschickt wird. In deiner Callback-Funktion cb_handle_login() reagierst du dann entsprechend auf die Antwort des Servers. Wenn du auf eine andere Seite weiterleiten möchstest, kannst du das bspw. mit
location.href = 'duBistEingeloggt.php';
machen.
Du hingegen meinst, ich sollte besser auch das erfolgreiche Anmelden per AJAX steuern und nicht nur das Fehlerhandling? In diesem Fall aber bräuchte ich doch gar kein onSubmit Handler mehr, oder? Sondern es würde reichen, einen normalen Button mit einem onClick zu belegen und alles weitere dann im JS-Teil abzuwickeln. Habe ich das richtig verstanden?
Mich irritiert die Abfrage
if(XMLHTTP.readyState==4 || XMLHTTP.readyState==0)
vor dem Absetzen des (Login-)Requests etwas. Was bezweckst du hiermit? Bzw. wie schaut der restliche Code dazu aus?
Das stammt von dieser Seite:
http://www.dynamicajax.com/fr/AJAX_Hello_World-271_290_322.html
Ich verwende es in der Funktion, die bei mir noch über das onSubmit aufgerufen wird:
function ajax_validate(user,pass) {
if(XMLHTTP.readyState==4 || XMLHTTP.readyState==0) {
XMLHTTP.open("GET","login_validation.php");
XMLHTTP.onreadystatechange = cb_handle_login;
XMLHTTP.send(null);
}
return false;
}
n'abend,
Ich hätte jetzt gedacht, die Validierung erfolgt per AJAX und im Anschluss wird das Formular entweder "ganz normal" abgeschickt ODER eine das Abschicken wird unterbunden und stattdessen eine Fehlermeldung angezeigt.
mir entzieht sich der große Sinn hinter diesem Vorgehen. Außer, dass alle nicht-Javascript-sprechenden Browser vor der Tür bleiben müssen und du eine etwaige Fehlermeldung angezeigt bekommst, ohne dass eine neue Seite geladen wird, gewinnst du hiermit nichts.
Du kannst dein obiges Vorhaben natürlich auch dann umsetzen, wenn du asynchrone Requests benutzt. Deine Callback-Funktion muss dann einfach abprüfen was der Server geantwortet hat und entsprechend das Formular abschicken, oder eine Fehlermeldung anzeigen. Das Passiert dann aber - wie gesagt - in der Callback-Funktion.
Du hingegen meinst, ich sollte besser auch das erfolgreiche Anmelden per AJAX steuern und nicht nur das Fehlerhandling?
Da ich nicht weiss, was das Abschicken deines Formulars bewirken soll, meine ich überhaupt nichts.
In diesem Fall aber bräuchte ich doch gar kein onSubmit Handler mehr, oder? Sondern es würde reichen, einen normalen Button mit einem onClick zu belegen und alles weitere dann im JS-Teil abzuwickeln. Habe ich das richtig verstanden?
Prinzipiell: ja.
Dadurch würdest du deine Seite dann aber gänzlich auf Browser limitieren, die Javascript können. Es gibt einige Betriebe, die veraltete Internet Exploder einsetzen, manche hassen Javascript derart, dass sie es gleich gänzlich filtern und unterbinden.
weiterhin schönen abend...
Hi,
mir entzieht sich der große Sinn hinter diesem Vorgehen. Außer, dass alle nicht-Javascript-sprechenden Browser vor der Tür bleiben müssen und du eine etwaige Fehlermeldung angezeigt bekommst, ohne dass eine neue Seite geladen wird, gewinnst du hiermit nichts.
Ich muss meine Daten ja irgendwie validieren, und das eben Serverseitig. Normalerweise sende ich dazu das Formular an das im form-Tag angegebene Script, daß mir daraufhin entsprechende Fehler anzeigt oder eben andere Aktionen durchführt. Mit dem Serverseitigen Validieren von Daten (egal ob das jetzt ein Anmeldeformular ist oder nicht, wie gesagt, das hier ist eine Spielerei, nichts Produktives) ist aber immer auch ein Reload verbunden - mittels AJAX würde ich das gern unterbinden und die Daten direkt während der Eingabe validieren.
Du kannst dein obiges Vorhaben natürlich auch dann umsetzen, wenn du asynchrone Requests benutzt. Deine Callback-Funktion muss dann einfach abprüfen was der Server geantwortet hat und entsprechend das Formular abschicken, oder eine Fehlermeldung anzeigen. Das Passiert dann aber - wie gesagt - in der Callback-Funktion.
Ja, genau so hatte ich Dich verstanden - das Formular wird dann per JS abgesandt, nicht mehr über den Submit-Button und "guten alten HTML".
Dadurch würdest du deine Seite dann aber gänzlich auf Browser limitieren, die Javascript können. Es gibt einige Betriebe, die veraltete Internet Exploder einsetzen, manche hassen Javascript derart, dass sie es gleich gänzlich filtern und unterbinden.
Wie gesagt, das ist mir bewußt. Es geht mir auch nicht darum, eine "echte" Anwendung zu schreiben - ich würde im Leben nicht auf die Idee kommen, ein Login-Formular nur mit JavaScript funktionieren zu lassen. Ich versuche einfach nur, mich etwas in Ajax einzuarbeiten und damit etwas rumzuspielen ;-)
n'abend,
Ich muss meine Daten ja irgendwie validieren, und das eben Serverseitig. Normalerweise sende ich dazu das Formular an das im form-Tag angegebene Script, daß mir daraufhin entsprechende Fehler anzeigt oder eben andere Aktionen durchführt. Mit dem Serverseitigen Validieren von Daten (egal ob das jetzt ein Anmeldeformular ist oder nicht, wie gesagt, das hier ist eine Spielerei, nichts Produktives) ist aber immer auch ein Reload verbunden - mittels AJAX würde ich das gern unterbinden und die Daten direkt während der Eingabe validieren.
nach der (serverseitigen) Validierung landest du aber wieder beim Client, wo deine Daten nach der Validierung wieder manipuliert werden können. Was hast du dann dadurch gewonnen?
Ja, genau so hatte ich Dich verstanden - das Formular wird dann per JS abgesandt, nicht mehr über den Submit-Button und "guten alten HTML".
Ob du das Absenden eines Formulars über den Submit-Button anstößt, oder es per Javascript machst, bewirkt das selbe: das Formular wird abgeschickt.
weiterhin schönen abend...