Javascript-setTimeout

Matthias Froese

Grünschnabel
Hallo! Ich bin in Zusammenhang mit der setTimeout-Methode auf ein Mysterium gestoßen, das ich mir nicht erklären kann. Gegeben ist folgende HTML-Seite

HTML:
<!DOCTYPE html>
<HTML>
 <HEAD>
  <META CHARSET="UTF-8">
  <META NAME="viewport" CONTENT="width=device-width, initial-scale=1.0">
  <TITLE>Javascript-Mysterium</TITLE>
  <STYLE TYPE="text/css">
<!--
body {
   color: #FFFFFF;
   background-color: #200020;
   font-family: "Lucida";
}
-->
  </STYLE>
 </HEAD>
 <BODY>
  <H1>Javascript-Mysterium</H1>
  <P> Ein neues Fenster öffnet sich für 10 Sekunden. Das neue Fenster soll nach 5 Sekunden umbenannti werden. </P>
  <P> Aber leider erhält es SOFORT den Namen, der eigentlich nach 5 Sekunden erscheinen sollte. </P>
  <SCRIPT SRC="js/mystery.js"></SCRIPT>
  <A HREF="#" ONCLICK="fenstermystery();"> Bitte hier klicken. </A>
 </BODY>
</HTML>

und folgendes Script:

Javascript:
var neufenster;
var fenstitel;
var fensterzu;
function neutitel(t) {
 neufenster.document.title=t;
}
function fenstermystery() {
 neufenster=window.open("","neufenster");
 neufenster.document.writeln("<HTML><HEAD><TITLE>Fenstertitel in HTML-Tags</TITLE></HEAD><BODY></BODY></HTML>");
 neutitel("Neu gesetzter Fenstertitel...");
 fenstitel=neufenster.setTimeout(neutitel('Nach 5 Sekunden erscheinender Fenstertitel!'),5000);
 fensterzu=neufenster.setTimeout("window.close()",10000);
}
document.writeln("<P> - Zur Demonstration bitte den Link unten anklicken. - </P>");

Der Knackpunkt sind die beiden setTimeout()-Aufrufe, die nach 5 Sekunden den Fenstertitel ändern sollen und 10 Sekunden das geöffnete Fenster wieder schließen.
Das Fensterschließen funktioniert tadellos wie gewünscht nach 10 Sekunden.
Aber: Der Fenstertitel "Nach 5 Sekunden erscheinender Fenstertitel!" erscheint unerwarteterweise nicht erst nach 5 Sekunden, sondern sofort.
Ich würde ja noch verstehen, wenn es mit dem neuen Titel gar nicht funktionieren würde.
Kann mir jemand freundlicherweise einen Tipp geben, warum hier nicht 5 Sekunden mit dem Aufruf der Neubetitelung gewartet wird? Ich habe ja alles schon in eine Funktion um das Problem mit der Variablenglobalität zu umgehen.
Na ja, bezüglich Javascript bin ich Neuling (ich habe da deutlich mehr Erfahrung in Java).
Vielen Dank im Voraus für etwaige Hilfe!
 
Dies ist ein häufiges Problem:
Code:
fenstitel=neufenster.setTimeout(neutitel('Nach 5 Sekunden erscheinender Fenstertitel!'),5000);
Was passiert, ist folgendes: Da neutitel von einem Klammernpaar gefolgt wird, wird diese Funktion sofort ausgeführt und ihr Rückgabewert als Parameter an setTimeout übergeben.
Abhilfe durch:
Code:
fenstitel=neufenster.setTimeout(function() {neutitel('Nach 5 Sekunden erscheinender Fenstertitel!');},5000);
 
Ah, vielen Dank, darauf wäre ich für eine ganze Weile nicht gekommen, aufgrund der Tatsache, dass window.close() ja ebenfalls ein Klammerpaar enthält und mir als absolut identisch vorgekommen ist. Lässt man da aber die Anführungszeichen weg, ergibt sich in der Fehler-Konsole der Eintrag, dass nur Fenster geschlossen werden dürfen, die man auch selbst geöffnet hat - und auch das Fensterschließen funktioniert nicht. Aber Anführungszeichen lassen sich im ersten setTimeout-Aufruf nicht verwenden, da dann die Funktion neutitel() nicht mehr bekannt ist. Gut, also vielen Dank!
 
dass window.close() ja ebenfalls ein Klammerpaar enthält und mir als absolut identisch vorgekommen ist
Nicht ganz identisch, denn window.close() war von Hochkommas eingeschlossen. Braucht die Funktion keine Parameter kann man auch ihre Referenz übergeben:
Code:
fensterzu=neufenster.setTimeout(window.close,10000);
Ist kein Klammernpaar vorhanden, wird die Funktion nicht sofort ausgeführt, sondern ihre Referenz an setTimeout übergeben. Ist das Klammernpaar jedoch vorhanden wird auch window.close sofort ausgeführt und scheitert, weil es im Kontext der aktuellen Seite ausgeführt wird und das Schließen dieses Fensters geblockt wird.
 
Zurück