Hallo Sebastian
wenn ihr diesen code mal unten ausfuehrt, werdet wahrscheinlich
auch auf die fehlermeldung stossen: "'a' is undefined". nun weiss
trotz diverser online referenzen bzw. skripten immer noch nicht
warum.
Eine gute Frage :-) und ich versuche mal zu helfen.
setTimeout bewirkt keine Unterbrechung des Programmablaufes, eine Funktion warten gibt es in JavaScript nicht. setTimeout bewirkt lediglich, dass der innerhalb des Methodenaufrufes notierte Programmcode verzögert ausgeführt wird (das beantwortet deine PS-Frage). Bis zum Einsetzen des Timeouts werden alle weiteren Programmzeilen abgearbeitet.
setTimeout wurde eingeführt mit der JavaScript-Version 1.0. In dieser Version setTimeout(expression, msec) muss expression immer ein String sein. Genau diese Art der Übergabe versuchst du innerhalb deiner Funktion.
Im ersten Aufruf wird der Funktion ein Array als Argument übergeben.
Id = window.setTimeout("test("+start+","+arr+")",timeout);}}
in dieser Zeile setzt du per Stringaddition den Übergabewert zusammen.
arr ist ein Array. Dieses Array wird automatisch zu einem String konvertiert und sieht so aus: a,b,c,d. Nach Ablauf der gewünschten Zeitspanne sieht der Funktionsaufruf so aus:
test(1,a,b,c,d)
die Variablen a,b,c,d existieren jedoch nicht. Damit kommt es zur Fehlermeldung und dem Abbruch des Ablaufes.
Ab JavaScript-Version 1.2 gibt es die Möglichkeit eine Funktion aufzurufen:
setTimeout(function, msec[, arg1[, ..., argN]])
Als optionalen Parameter kann man im Netscape und Mozilla (und nur in diesen Browsern!) Argumente übergeben.
Dein Aufruf würde dann so aussehen:
Id = window.setTimeout(test,timeout,start,arr);
Zu beachten ist hier, dass nach der Funktion keine Klammern folgend dürfen. In dieser Notation ist es möglich, Objekte zu übergeben.
Zu schade, das Opera und IE dies nicht unterstützen. Da du Arrays hast, kann man dieses Problem verhältnismäßig leicht umgehen.
Notiere am Anfang der Funktion diese Zeile:
arr=arr.toString().split(",");
oder alternativ:
if (typeof arr == "string") arr=arr.split(",");
Die erste Variante wandelt den Parameter arr in einen String und erzeugt über split() ein Array. Das toString() ist notwendig, um sicherzustellen, dass die Methode wirklich auf ein Stringobjekt anwendet wird.
Die zweite Variante prüft, ob der Parameter vom Typ string ist und wendet gegebenenfalls die Methode split() darauf an.
Dann brauchst du nur noch diese Zeile
Id = window.setTimeout("test("+start+","+arr+")",timeout);
ändern in:
Id = window.setTimeout("test("+start+",'"+arr+"')",timeout);
Die einfachen Anführungsstriche sorgen dafür, dass folgende
ausführende Zeile entsteht:
test(1,'a,b,c,d')
Damit hast du einen String, den du in ein Array umwandeln kannst. Voraussetzung ist jedoch, dass im Array keine Objekte gespeichert sind.
Als weitere Möglichkeit steht dir noch die Verwendung von globalen Variablen offen. D.h. du verzichtest auf die Parameter und wertes globale Variablen aus.
Viele Grüße
Antje