Ragnar: AJAX-Script hängt sich nach einiger Zeit auf

<html><head>  
<title>JS-Test3</title>  
<script>  
var xmlHttp=GetXmlHttpObject();  
  
function GET()  
{  
 //xmlHttp=GetXmlHttpObject();  
 if (xmlHttp==null)  
 {  
  alert ("Your browser does not support AJAX!");  
  return;  
 }  
 var url="JS.php?random="+Math.random();  
 xmlHttp.onreadystatechange=stateChanged;  
 xmlHttp.open("GET",url,true);  
 xmlHttp.send(null);  
 document.getElementById("Test").innerHTML="Bitte warten, Daten werden geladen!";  
}  
  
function stateChanged()  
{  
 if (xmlHttp.readyState==4)  
 {  
  if(xmlHttp.status==200)  
  {  
   //alert("Fertig geladen!");  
   document.getElementById("Test").innerHTML=xmlHttp.responseText;  
  }  
  else  
  {  
   document.getElementById("Test").innerHTML="Fehler beim empfangen der Daten: "+xmlHttp.statusTest;  
  }  
 }  
  
 setTimeout("GET()", 2000);  
}  
  
function GetXmlHttpObject()  
{  
 var xmlHttp=null;  
 try  
 {  
  // Firefox, Opera 8.0+, Safari  
  xmlHttp=new XMLHttpRequest();  
 }  
 catch (e)  
 {  
  // Internet Explorer  
  try  
  {  
   xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");  
  }  
  catch (e)  
  {  
   xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");  
  }  
 }  
 return xmlHttp;  
}  
window.onload = GET;  
</script>  
</head><body>  
<div id="Test">Bitte warten, Daten werden geladen!</div><br />  
<div id="Test2">Daten sehen sie hier!</div>  
</body></html>

Die Datei "JS.php" gibt immer nur Zufallszahlen aus, diese werden auch prima auf der Seite angezeigt und aktualisiert aber nach einiger Zeit bleibt die Aktualisierung einfach stehen und die CPU-Auslastung steigt in die Höhe...
Das Problem besteht bei Opera und IE7, hat jemand eine Anhnung, wie man das beheben kann?

mfg Ragnar

  1. Guten Morgen, Ragnar!

    Das Problem scheint darin zu bestehen, dass Du mit setTimeout den Stack überlastest. Versuche es stattdessen lieber mit setInterval oder ganz ohne AJAX, mit einem iframe, dessen Inhalt einen meta-Refresh verwendet (ich weiß, iframes sind böse - aber sie funktionieren).

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. Danke für den Tipp mit setinterval!
      Iframes hatte ich am Anfang auch im Sinn aber man hört dann immer alle zwei Sekunden son Klick... (keine schöne Sache)

      mfg Ragnar

    2. Es geht jetzt alles Wunderbar!
      Nochmals Danke!!

      mfg Ragnar.

  2. Hallo,

    function stateChanged()
    {
    if (xmlHttp.readyState==4)
    {
      if(xmlHttp.status==200)
      {
       //alert("Fertig geladen!");
       document.getElementById("Test").innerHTML=xmlHttp.responseText;
      }
      else
      {
       document.getElementById("Test").innerHTML="Fehler beim empfangen der Daten: "+xmlHttp.statusTest;
      }
    }

    setTimeout("GET()", 2000);
    }

    Du startest bei jedem readystatechange-Ereignis einen Timeout. Die Anzahl der Anfragen nehmen dann exponentiell zu, weil mit jedem XMLHttpRequest vier weitere gestartet werden. Damit bombst du natürlich den Server mit Anfragen voll und zwingst den Browser in die Knie. Starte ihn nur dann, wenn readyState == 4 ist, also der letzte abgelaufen ist.

    Übrigens kannst du XMLHttpRequest-Objekte wiederverwenden. Wenn es dir um Performance geht, dann solltest du auch die Browserabfrage nicht immer wiederholen (wobei sich das erübrigt, wenn du das XMLHttp-Request-Objekt weiterverwendest).

    Mathias