zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Javascript & Ajax
Seite neu laden [PROTOTYPE] Funktion erst beenden, wenn Ajax Aufruf abgeschlossen ist

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 08.04.2009, 20:19
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 08.05.2007
Beiträge: 28
naitsab befindet sich auf einem aufstrebenden Ast
Standard [PROTOTYPE] Funktion erst beenden, wenn Ajax Aufruf abgeschlossen ist

Hallo,

ich bin gerade ein bisschen am Testen mit Prototype, weil die Materie für mich noch neu ist.
Ich habe ein Login-Formular auf einer Seite und dieses wird mit Javascript abgeschickt und dann soll mit Ajax gecheckt werden, ob die Login.php "1" für Success und "0" für Failure ausgibt.
Ich habe aber die Vermutung, dass die login(); Funktion schon beendet wird, ehe der Ajax Durchgang abgeschlossen ist.

Meine Login Funktion sieht so aus:
Code:
function login()
{
  new Ajax.Request('login.php',
    {
      method:'post',
      parameters: $('login_form').serialize(true),
      onSuccess: function(transport){
        var response = transport.responseText || "no response text";
        
        if(response==1)
        {
            return("LOGGED IN");
        }
        else
        {
            return("NOT IN");
        }
        
      },
      onFailure: function(){ alert('Something went wrong...') }
    });
}
Nach dem Abschicken des Formulars wird folgende Funktion aufgerufen:
Code:
<form id="login_form" method="POST" onSubmit="return check()">

[...]

function check()
{
     var LoggedIn=login();
     document.getElementById('test_ausgabe').innerHTML=LoggedIn;
     if(LoggedIn=="NO")
     {
        //fehler meldung
        return(false);
     }
     
     if(LoggedIn=="YES")
     {
        // alles ok
     }
}
Die Ausgabe von login();, die ich mir ja testweise ausgebe, gibt immer "undefined" aus.
Deswegen habe ich die Vermutung, dass die login(); Funktion schon beendet wird, ehe der Ajax Durchgang abgeschlossen ist.

Liege ich da richtig oder habe ich da irgendwo anders einen anderen Fehler eingebaut?
Wäre nett, wenn mir da jemand auf die Sprünge helfen kann.

Viele Grüße
naitsab
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 08.04.2009, 23:23
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 10.12.2006
Beiträge: 887
threadi sorgt für eine eindrucksvolle Atmosphärethreadi sorgt für eine eindrucksvolle Atmosphäre
Standard

Gib dem AJAX-Request eine Zufallszahl mit. Diese muss der AJAX-Request dann auch wieder zurück liefern. Prüfe dann gleichzeitig in einer weiteren Funktion regelmäßig (z.B. alle 500ms), ob diese Zufallszahl nun schon zurückgegeben wurde. Solange es hier keine Antwort gibt wird das Formular auch nicht abgeschickt.

Soweit die Theorie. Ich habe das beim SAJAX schon hinbekommen. Wie es bei Prototype geht weiß ich nicht.
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 09.04.2009, 01:44
Benutzer
neuer user
 
Registriert seit: 11.04.2004
Beiträge: 61
molily wird schon bald berühmt werden
Standard

Zitat:
Zitat von naitsab Beitrag anzeigen
Ich habe aber die Vermutung, dass die login(); Funktion schon beendet wird, ehe der Ajax Durchgang abgeschlossen ist.
Du hast gerade herausgefunden, was das »A« in »Ajax« bedeutet: Nämlich »asynchron«!

Insofern ist das ganz logisch: Was du synchron lösen willst, wird tatsächlich mit Event-basiert mit Callback-Funktionen gemacht. Deine Funktion login hat nie ein Rückgabewert und du kommst auch in der login-Funktion nicht an den Rückgabewert der onSuccess-Callback-Funktion.

Mach dir diesen asynchronen Ablaf bewusst: Wenn du einen Ajax-Request erzeugst, wird der im Hintergrund ausgeführt. Dein Programm läuft weiter und wartet nicht auf die Antwort. Wenn die Serverantwort ankommt, wird die onSuccess-Callback-Funktion gefeuert. Erst darin kannst du das ausführen, was getan werden soll, wenn der Loginstatus bekannt ist.

Zitat:
Code:
<form id="login_form" method="POST" onSubmit="return check()">
Du kannst hier nicht einen Request absenden, auf das Ergebnis warten und dann ggf. das Absenden des Formulars unterdrücken bzw. zulassen. Das geht wegen der Asynchronität nicht.

Was du stattdessen tun kannst:

Code:
onsubmit="login(); return false"
Also login aufrufen (Request läuft dann asynchron im Hintergrund) und immer die Standardaktion unterdrücken. Das Absenden des Formulars kannst du dann im onSuccess-Funktion erneut anstoßen.

Folgendes schreibst du dann in den onSuccess-Callback:

Code:
if (response == "1") {
   // Formular per JS absenden, wenn alles okay ist
   document.forms.formular.submit();
} else {
   alert("fehlermeldung");
}
Mit Zitat antworten
  #4 (permalink)  
Alt 09.04.2009, 16:41
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 08.05.2007
Beiträge: 28
naitsab befindet sich auf einem aufstrebenden Ast
Standard

molily, vielen Dank für die ausführliche und verständliche Antwort!

Gut zu wissen, dass die Ajax Aufrufe asynchron ablaufen. Das hätte ich mir beim Namen zwar auch denken können, aber über sowas denkt man wohl nicht nach, wenn man mitten in einer Problemlösung steckt
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Jquery AJAX Aufruf und Tablesorter MoFu Javascript & Ajax 2 18.09.2009 10:09
[PHP] Funktion zum Optimieren von CSS Floele Serveradministration und serverseitige Scripte 2 13.08.2005 11:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:49 Uhr.