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

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 :)

  1. 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>");

    ^Hiermit wird ein neues Dokument begonnen. In diesem gibt es die Funktion showProgress() nicht mehr.

    tout = window.setTimeout("showProgress()",500);

    ^Error Objekt erwartet im IE und etwas ausführlicher:
    Fehler: showProgress is not defined
    Quelldatei: xyz
    Zeile: x
    in der JavaScript-Konsole des Mozilla.

    }

    </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.

    Mit Sicherheit nicht.

    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.

    Du erlaubst, dass ich das bezweifle?

    Schreibe in Dein Dokument ein HTML-Element (z.B. ein DIV) mit einer ID. Nutze die Methode getElementById() und appendData http://selfhtml.teamone.de/javascript/objekte/node.htm#append_data, um die Punkte einzufügen, statt mit document.write ein neues Dokument zu beginnen.

    viele Grüße

    Axel