cpw: Überprüfen des Funktions-Status in AJAX aus anderer Funktion

Beitrag lesen

Hallo,

ich habe ein kleines Problem mit AJAX, dessen Lösung ich momentan nur "hingepfuscht" bekomme...
Das ganze ist recht schwierig zu beschreiben, aber ich versuch's mal:

Folgendes Beispiel (tut nichts wirklich sinnvolles, soll nur das Problem verdeutlichen):

  
<html>  
<head>  
<script type="text/javascript">  
var ajax = null;  
  
    if (typeof XMLHttpRequest != 'undefined')  
    {  
        ajax = new XMLHttpRequest();  
    }  
  
 if (!ajax)  
 {  
     try  
     {  
         ajax = new ActiveXObject("Msxml2.XMLHTTP");  
     }  
  
     catch(e)  
     {  
  try  
  {  
      ajax = new ActiveXObject("Microsoft.XMLHTTP");  
  }  
  
  catch(e)  
  {  
      ajax = null;  
      window.alert('Ihr Browser unterstützt keine AJAX-Funktionalität. Wir empfehlen, einen aktuellen Browser zu verwenden.');  
  }  
     }  
 }  
  
  
var daten;  
  
function holeDaten()  
{  
    if(ajax)  
    {  
        ajax.open('POST', 'daten.xml', true);  
 ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");  
  
 ajax.onreadystatechange = function()  
 {  
     if(ajax.readyState == 4)  
     {  
         daten = ajax.responseXML.documentElement;  
     }  
 };  
  
 ajax.send(null);  
    }  
  
}  
  
holeDaten();  
  
  
function zeigMirDieDaten()  
{  
  
alert(daten.hasChildNodes());  
  
}  
  
zeigMirDieDaten();  
  
  
</script>  
</head>  
<body>  
</body>  
</html>  

Der Firefox sagt mir hier in der JavaScript-Console: "daten has no properties" - der Fehler wird vermutlich hervorgerufen, da zum Zeitpunkt an dem "zeigMitDieDaten()" aufgerufen wird, "holeDaten()" noch nicht fertig ist, also die Variable "daten" noch null ist.

Mein erster Gedanke: OK, mach ich's mit "SJAX", also setze ich doch einfach den Synchronisations-Parameter bei ajax.open() auf false - so sollte ja theoretisch mit der Ausführung des Skripts gewartet werden, bis alle Daten vollständig übertragen sind.

Im IE 7 funktioniert das - beim Laden der Seite erscheint das alert-Fenster mit "true" - der Firefox besteht weiterhin darauf, dass "daten" keine Properties hat.

Versuch zwei: "ajax" ist ja eine globale Variable, also müsste ich ja theoretisch auch in der "zeigMirDieDaten()"-Funktion Zugriff darauf haben und den "onreadystatechange"-Event abfragen können. Also ändere ich "zeigMitDieDaten()" folgendermaßen:

  
function zeigMirDieDaten()  
{  
    ajax.onreadystatechange = function()  
    {  
        if(ajax.readyState == 4)  
 {  
     alert(daten.hasChildNodes());  
  
 }  
    };  
}  

Hier passieren äusserst seltsame Dinge... der IE sagt nun: " 'daten' ist null oder kein Objekt" - obwohl das ja theoretisch in dieser Konstellation nicht mehr sein kann, die Daten müssen ja da sein...

Der Firefox zeigt keine JavaScript-Fehlermeldung an, tut aber auch sonst nix, hört also scheinbar nicht auf das "onreadystatechange" der "holeDaten()"-Funktion.

Methode drei: Der Rekursions-Holzhammer... :

  
function zeigMirDieDaten()  
{  
    try  
    {  
        alert(daten.hasChildNodes());  
    }  
  
    catch(e)  
    {  
        window.setTimeout("zeigMirDieDaten()", 250);  
    }  
}  

D.h. ich rufe die Funktion in bestimmten Zeitabständen einfach immer wieder rekursiv auf... funktioniert sowohl im IE als auch im FF, ist aber IMHO nicht die Lösung deluxe... vor allem dürfte diese Rekursion unendlich laufen, falls z.B. die "holeDaten()"-Funktion kein Daten vom Server bekommt. Der Firefox und der IE7 brechen irgendwann ab, der IE6 - und evtl. auch einige andere Browser - hängen sich dabei aber ganz gerne mal komplett weg.

Gibt's für sowas keine elegante Lösung, mit der ich irgendwie in einer anderen Funktion festlegen kann, dass erst wenn alle Daten einer bestimmen anderen AJAX-Funktion da sind, weitergemacht wird - z.B. irgendwie über Eventhandler?

Gruß, Christian