• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

setTimeout in function(){} einbetten

dasM

Neues Mitglied
Ich würde gerne eine Methode schreiben, die von einem String (einem Satz oder Wort, im Prinzip hier nicht relevant) in einem bestimmten Zeitabstand nacheinander alle Zeichen auf dem Bildschirm ausgibt, Beginn beim 1. Zeichen. Der Zeitabstand soll beliebig manipulierbar sein. Habe bisher folgenden Quelltext:

<html>
<head>
<title>bla</title>


<script type="text/javascript">

var satz = "Zwei Buchstaben pro Sekunde";
var buchst = satz.split("");
var i = 0;
var a = satz.length;

function f(){
if (i<a){
document.write(buchst);
i = i+1;
document.setTimeout(f(), 500);
}else{
}
}
</script>
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<input type="button" value="Textausgabe"
onclick="f()"
</body>
</html>

Problem: Diese Funktion gibt zwar rekursiv den Inhalt der var satz Schritt für Schritt wieder, scheint jedoch die Methode setTimeout buchstäblich zu übersehen. Wenn man in der Timeout-Methode die Funktion f() in Anführungsstriche setzt- document.setTimeout("f()", 500); -, bleibt das Programm bereits vor dem ersten rek. Funktionsaufruf hängen. Darf man die setTimeout-Methode nicht in eine function() einbetten??
Würde mich über jede Idee freuen, die irgendwie zum Ziel führt.
 
Das

Code:
document.setTimeout(f(), 500);

musst du so schreiben

Code:
window.setTimeout("f()", 500);
 
Nein.

Code:
setTimeout(f, 500);
Strings an setTimeout weiterzureichen ist strengstens zu vermeiden! "window" braucht man nicht, das findet JavaScript selbst, denn es steigt so lange einen Kontext hoch, bis es beim Default-Namespace ankommt und das ist eben "window". Wenn dort "setTimeout()" nicht gefunden wird, wird ein Fehler geworfen. Man schreibt ja auch nicht "window.document.getElementById()" oder "window.location.href".
 
So wie ich es schrieb? Primitive Eigenschaften werden kopiert und komplexe werden referenziert. Genau deshalb übergebe ich eine Funktions-Referenz (eigentlich kein Referenz, wie man Sie aus anderen Sprache kennt).
 
Und genau das irritiert mich.

Beispiel:
Ich habe eine Funktion X die mit den Parametern a und b aufgerufen wird. Also:
Code:
function X(a, b) { ... }{/code]

Wie rufst Du diese Funktion nun mit diesen Parametern auf? Ich würde es so machen:

[code]window.setTimeout("f('a','b')",500);
 
Closures bzw. bind (inzwischen ECMA-Standard):
Code:
setTimeout(function (a, b) {
    return function () { X(a, b) };
}("aa", "bb"), 1000)
Code:
setTimeout(X.bind(null, "a", "b"), 1000)
Sorry erstes Beispiel war erst falsch. Zweites auch.
 
Zurück
Oben