Thomas Niegel: AJAX streikt im IE

Hi zusammen,

ich habe ein für mich nicht nachvollziehbares AJAX-Problem beim IE.

Ich möchte einfach daten dynamisch nachladen. Im Firefox funktioniert alles wunderbar. Der IE bricht die Scriptverarbeitung ab, in dem Moment in dem ich auf "xmlHttp.responseText" zugreife.

Hat jemand dafür eine Lösung?

Danke
Thomas

Mein Quellcode:

var xmlHttp = null;

function handleResponse() {
 if (xmlHttp.readyState == 4) {

alert(xmlHttp.getAllResponseHeaders()); // => hier kommt das script noch an
  var tpm = xmlHttp.responseText;
  alert(tpm); // => hier nicht mehr.

if(document.getElementById) document.getElementById("counter_online").innerHTML = xmlHttp.responseText;
  else if(document.all) counter_online.innerHTML = xmlHttp.responseText;
 }
}

if (window.XMLHttpRequest) {
 xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
 // Internet Explorer 6 und lter
 try {
  xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
 } catch(e) {
  try {
   xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
  } catch(e) {
   xmlHttp  = null;
  }
 }
}

function ReloadCounter() {

if (xmlHttp != null) {
  xmlHttp.open('GET', 'counter_dhtml.php', true);
  xmlHttp.onreadystatechange =handleResponse;
  xmlHttp.send(null);
 }

}

  1. Hallo Thomas Niegel,

    Hat jemand dafür eine Lösung?

    Du könntest die fehlermeldung mal nennen. Ansonsten würde ich die Reihenfolge der Methodenaufrufe mal wie hier beschrieben drehen

    if (xmlHttp != null) {
      xmlHttp.open('GET', 'counter_dhtml.php', true);
      xmlHttp.onreadystatechange =handleResponse;
      xmlHttp.send(null);
    }

    in:

    • onreadystatechange
    • open
    • send

    Mit freundlichem Gruß
    Micha

    1. Hi Micha

      »Du könntest die fehlermeldung mal nennen.
      Ich bekomme keine Fehlermeldung. (bzw. ich weiß nicht, wo ich die prüfen könnte)
      Das Script bricht einfach Kommentarlos ab.

      xmlHttp.readyState ist 4
        xmlHttp.Status ist 200
      egal wie ich auf xmlHttP.responseText zugreife, danch wird das Script nicht weiter ausgeführt.

      Die Methodenaufrufe hab' ich auch schon geändert. Hat nix gebracht.

      Hab' aber mittlerweile was interessantes rausgefunden.
      Ich habe von einer anderen Seite (http://www.w3clubs.com/mozdev/httprequest_test.html) den Quellcode kopiert. Auf deren Seite funktioniert es auch im IE.
      Wenn ich das ganze auf meinem Server ausführe, dann läuft wieder nur der Firefox. ?!

      Liebe Grüße
      Thomas

      1. Hallo Micha,

        Ich bekomme keine Fehlermeldung. (bzw. ich weiß nicht, wo ich die prüfen könnte)

        Vielleicht so:

          
        
        >   alert(xmlHttp.getAllResponseHeaders()); // => hier kommt das script noch an.  
          
             try {                                  //     versuchen wir  
          
        
        >     var tpm = xmlHttp.responseText;      //     den kritischen Zugriff  
          
             } catch(e) {                           //     und fangen den Fehler ab.  
          
               alert('Fehler: ' + e);               //     -> Fehlermeldung?  
             }  
          
        
        >   alert(tpm);                            // => hier nicht mehr.  
        
        

        Gruß, Don P

        1. So bekomme ich Fehler: [object Error] angezeigt.

          Falls das interessant ist, im moment liefert das Script, welches hoffentlich angesprochen wird folgendes:

          <?xml version="1.0" encoding="ISO-8859-1"?><author><online>1</id></author>

          zu Anfang hatte ich nur die "1" als Ergebnis. Mit dem gleichen Resultat, daß das Script abgebrochen hat.

          Hallo Micha,

          Ich bekomme keine Fehlermeldung. (bzw. ich weiß nicht, wo ich die prüfen könnte)

          Vielleicht so:

          alert(xmlHttp.getAllResponseHeaders()); // => hier kommt das script noch an.

          try {                                  //     versuchen wir

          var tpm = xmlHttp.responseText;      //     den kritischen Zugriff

          } catch(e) {                           //     und fangen den Fehler ab.

          alert('Fehler: ' + e);               //     -> Fehlermeldung?
               }

          alert(tpm);                            // => hier nicht mehr.

          
          > Gruß, Don P  
          > 
          
          1. So bekomme ich Fehler: [object Error] angezeigt.

            Falls das interessant ist, im moment liefert das Script, welches hoffentlich angesprochen wird folgendes:

            <?xml version="1.0" encoding="ISO-8859-1"?><author><online>1</id></author>

            Ohje, da ist ja Einiges im Argen.

            <online>1</id>

            das passt nicht. Wenn Du in XML einen Tag <online> aufmachst, musst Du den auch wieder schließen, entweder mit </online> oder im Tag <online> selbst: <online/>

            </id>

            Dieser Tag wurde nicht eröffnet.

            Was Du richtig hast:
            <?xml version="1.0" encoding="ISO-8859-1"?>
            <author>
            </author>

            Viele Grüße,
            Hotte

            1. Hallo Horst,

              Ich will ja nicht meckern, aber du solltest doch etwas mehr in den Threads lesen: Es ist heute das 2. mal, dass du einen Kommentar postest zu Problemen, die längst gelöst oder erkannt sind.

              Thomas hat hier seine Tippfehler bereits 3 Minuten später korrigiert, und du kommst nach 5 1/2 Stunden und kommentierst ausgerechnet sein erkanntermaßen fehlerhaftes Posting.

              Im anderen Thread mit den Zweierpotenzen war dein Hinweis auf die Binärdastellung von heute bereits seit 2 Tagen bekannt und diskutiert worden.

              *SCNR*

              Gruß, Don P

      2. Kleiner Nachtrag:

        Ich bitte die Tipp- und kopierfehler zu entschuldigen :)

        Die aufgerufene Seite liefert folgendes zurück:

        <?xml version="1.0" encoding="ISO-8859-1"?><author><online>1</online></author>

        1. Hallo,

          Die aufgerufene Seite liefert folgendes zurück:

          <?xml version="1.0" encoding="ISO-8859-1"?><author><online>1</online></author>

          Ok, das ist ja ein komplettes XML-Dokument. Evtl. kannst du mittels xmlHttp.responseXML zuzugreifen. Das liefert ein entsprechendes DOM-Objekt:

            
          if(document.getElementById) {  
            document.getElementById("counter_online").innerHTML = xmlDoc.getElementsByTagName("online")[0].childNodes[0].nodeValue;  
          } else if(document.all) {  
            counter_online.innerHTML = xmlDoc.getElementsByTagName("online")[0].childNodes[0].nodeValue;  
          }  
          
          

          Denn xmlHttp.responseText ist für Text-Rohdaten gedacht. Du willst ja auch nur reinen Text empfangen, um ihn dann mit

          if(document.getElementById) document.getElementById("counter_online").innerHTML = xmlHttp.responseText;
            else if(document.all) counter_online.innerHTML = xmlHttp.responseText;

          einzusetzen.

          Also könntest du doch einfach dafür sorgen, dass dein 'counter_dhtml.php' auch wirklich nur reinen Text schickt, kein komplettes XML-Dokument. Dazu muss auch der richtige HTML-Header geschickt werden, also in 'counter_dhtml.php':

            
          header('Content-Type: text/html; charset=iso-8859-1'); // sorgt für die korrekte Kodierung  
          header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); // wichtig für IE  
          
          

          Gruß, Don P

        2. Sorry, ich hatte 'xmlDoc' ja gar nicht definiert, hier also nochmal:

            
          var xmlDoc = xmlHttp.responseXML.documentElement;  
            
          if(document.getElementById) {  
            
            document.getElementById("counter_online").innerHTML = xmlDoc.getElementsByTagName("online")[0].childNodes[0].nodeValue;  
          }
          

          Gruß, Don P

  2. Hallo,

    vermutlich liegts am Request.

    Versuchts mal so (url entspr. anpassen):
    function loadWords(){
      var url = '/cgi-bin/words.cgi?finde='+document.getElementById('suchwort').value;
      if (window.XMLHttpRequest) {
       req = new XMLHttpRequest();
       req.onreadystatechange = responseHandler;
       req.open("GET", url, true);
       req.send(null);
      }
      else if (window.ActiveXObject) {
       req = new ActiveXObject("Microsoft.XMLHTTP");
       if (req) {
        req.onreadystatechange = responseHandler;
        req.open("GET", url, true);
        req.send();
       }
      }
     }

    Viele Grüße,
    Hotte