Mark: AJAX / Internet Explorer / Formularanzeige

Hallo,

habe gerade angefangen, ein wenig mit dem AJAX-Konzept herumzuprobieren.
Zunächst habe ich also eine Anwendung geschrieben, die auf Knopfdruck vom Server zwei unterschiedliche Textdateien ausliest und in einem Container anzeigt. Ein dritter Link lässt auf dem Server ein PHP Script laufen, das ebenfalls eine Textdatei (1,5MB) ausliest und an den Browser sendet, der diese dann anzeigt. Die Dateigröße nur, damit der Ladevorgang ersichtlich wird.
Das funktioniert auch alles genauso wie es soll im FireFox. Das Problem macht mal wieder der Internet Explorer:
Solange ein Request bearbeitet oder geladen wird, erscheint in einem Formular "actionform" im Textfeld "t" die Meldung "Bitte warten...". Sobald der Request vollständig eingegangen ist, wird das Textfeld auf "." gesetzt. Soweit im FireFox.
Der IE zeigt diese Statusmeldungen nur einmal pro Link an. Wenn man also zum zweiten Mal auf denselben Link klickt, ändert er das Textfeld nicht mehr.
Vielleicht kann mir ja jemand erklären, woran das liegt und ob das zu ändern ist! Danke.

CODE:

<script language="javascript" type="text/javascript">
<!--
function create_httprequest() { // returns a browser-independend httpRequest Object
  var req = null;
 try {
    req = new ActiveXObject("MSXML2.XMLHTTP");
  }
  catch (err_MSXML2) {
    try {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (err_Microsoft) {
      if (typeof XMLHttpRequest != "undefined")
        req = new XMLHttpRequest;
        req.overrideMimeType('text/xml');
    }
  }
  return req;
}

function show_div_info(){
 if(http_request.readyState == 4){
   //alert(http_request.status);
    if(http_request.status == 200){
      var output = http_request.responseText;
      output = output.replace("\n", "<br />");
      document.getElementById("div").innerHTML = output;
      document.actionform.t.value = '.';
    }
    else{
     document.actionform.t.value = 'Fehler am Request-Server.';
    }
  }
  else if(http_request.readyState != 4){
   document.actionform.t.value = 'Bitte warten...';
  }
}

function hr(dat_nam){
  http_request = create_httprequest();
 http_request.onreadystatechange = show_div_info;
 http_request.open('GET', dat_nam, true);
  //http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Nur nötig für POST Daten!
  http_request.send(null);
}
-->
</script>

  1. Versuch mal mit

    http_request.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');

    das cachen der Daten zu verhindern.

  2. Hallo,

    Ich glaube nicht, dass das Problem am Cache liegt. Auch dann sollte der readystatechange-Handler aufgerufen werden. Auch dann sollte responseText korrekt gefüllt sein (wenn auch mit möglicherweise alten Daten).

    function show_div_info(){

    Füge hier einmal alert(http_request.readyState) ein. Durchläuft der Request alle Status korrekt?

    if(http_request.readyState == 4){
       //alert(http_request.status);

    Kommentiere diesen alert(); einmal aus: Kommt MSIE zu diesem Code? Wie ist der Status beim zweiten Request?

    if(http_request.status == 200){
          var output = http_request.responseText;
          output = output.replace("\n", "<br />");
          document.getElementById("div").innerHTML = output;
          document.actionform.t.value = '.';
        }
        else{
         document.actionform.t.value = 'Fehler am Request-Server.';
        }

    Und kommt MSIE zu diesem Code? Wenn nicht »Fehler« ausgegeben wird, muss er ja in den Körper der if-Anweisung einsteigen. Ist responseText denn korrekt gefüllt?

    Mathias

    1. Hi

      Also ich habe folgendes probiert (schon vor dem posten):
      Habe ein alert() an jeder Stelle, an der eine Änderung passiert eingefügt. Der Witz dabei: Jetzt schreibt der IE den Status auch in das Textfeld des Formulars!!! Sobald der JS Code ohne "Pausen" läuft, zeigt er diesen Status nur beim ersten laden eines jeden Requests an, danach lässt er es wieder bleiben! Also funktionieren tut es, (im FF einwandfrei) aber eben im IE nur, wenn man Stopps einbaut!

      Gruß,
      Mark