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