Oliver Kurlvink: setTimeout funktioniert in Mozilla, im IE aber nicht

Beitrag lesen

Hallo,

ich habe hier ein obskures Problem mit dem Internet Explorer und setTimeout.

Ich mache folgendes (ausschnittsweise):

<html>
<head>

<script language="javascript">
// Display a progress meter element
function showProgress()
{
    document.write(".<wbr>");
    tout = window.setTimeout("showProgress()",500);
}

</script>

</head>
<body onLoad="cls()">
Ihre Suche wird ausgeführt. Bitte warten Sie, bis die Ergebnisse angezeigt werden.<br><br>
<b>Warte auf Antwort</b>

<script language="javascript">
// Start the progress meter
tout = window.setTimeout("showProgress()",1);
</script>

Ich starte also hier unten per setTimeout mit 1 Millisekunde Verzögerung die Funktion showProgress. showProgress startet nun seinerseits wiederum setTimeout mit 500 Millisekunden und ruft sich selber auf. Ergebnis: Alle 0,5 Sekunden wird mir ein Punkt ausgegeben.

Nicht sichtbar ist hierbei im Hintergrund eine PHP-Routine, die eine Datei abfordert und sobald der Server anfängt zu senden per clearTimeout den aktuell laufenden Timeout und somit jeden weiteren Aufruf der showProgress-JS-Funktion unterbindet.

Sobald die Datei vollständig per PHP eingelesen wurde wird sie in document.write-Anweisungen zerteilt und dann hiermit eingefügt:

<script language="javascript">
function cls()
{
    document.open("text/html","replace");
    <?php
    foreach ($output as $line) {
        print "document.writeln("".addslashes($line)."");";
    }
    ?>
    document.close();
}
</script>

Die Funktion ist als onLoad im Body-Tag angegeben. Nach dem Vollständigen Laden der Seite wird mit diesem Event die Funktion cls ausgeführt und somit der aktuelle Seiteninhalt mit dem der heruntergeladenen Datei ersetzt.

Insgesamt:

  • Start von showProgress mit setTimeout
  • showProgress startet sich selber mit setTimeout immer weiter
  • Bei einer Reaktion des Zielservers wird der Timeout angehalten, somit wird auch showProgress nicht mehr weiter ausgeführt
  • Sobald die Datei vollständig eingelesen wurde werden viele document.write-Anweisungen generiert und die Seite ist vollständig geladen.
  • Ein onLoad-Event im Body-Tag löscht den Seiteninhalt und fügt den neuen Inhalt ein.

Fast alles funktioniert in Mozilla und dem IE perfekt. Der IE scheint allerdings ein Problem mit dem ersten setTimeout-Aufruf zu haben. Er meldet immer, dass in Zeile 1 und Spalte 1 ein Objekt erwartet wird. Der ganze Rest mit dem Austauschen des Inhalts usw. verläuft danach dann weiterhin fehlerfrei.

Woher kann dieser Fehler kommen?

Ciao :)