setTimeout, Funktions-Parameter verweist auf array
Angela
- javascript
0 Thomas Meinike0 Angela0 Axel Richter0 Angela
liebe leute im forum,
auf meiner homepage erzeuge ich mithilfe von arrays animationen (bildtausch).
die animation wird per mouseclick gestartet
<area shape=rect coords="0,0,560,434" onClick="showit(p)" nohref>
und wird über folgendes script gesteuert:
var stepshowit = 0;
var p = new Array ("img/p_0.gif","img/p_1.gif","img/p_0.gif","img/p_2.gif","img/start_x.gif");
function showit(whichrun)
{
var m = whichrun.length;
if (stepshowit < m)
{
window.document.images[0].src = whichrun[stepshowit];
stepshowit++;
idshowit=window.setTimeout("showit("+whichrun+")",125);
}
else
{
clearTimeout(idshowit);
stepshowit=0;
}
}
leider funktioniert es nicht.
ich nehmee an das problem liegt bei der uebergabe der funtions-parameter in setTimeout.
ich weiss, das der funktionsaufruf als string übergeben werden muss.
wisst ihr, wie´s geht?
vielen dank schon jetzt!
angela
hier nochmal der komplette quellcode:
<HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HEAD>
<TITLE></TITLE>
<SCRIPT language="JavaScript">
<!--
var stepshowit = 0;
var p = new Array ("img/p_0.gif","img/p_1.gif","img/p_0.gif","img/p_2.gif","img/start_x.gif");
function showit(whichrun)
{
var m = whichrun.length;
if (stepshowit < m)
{
window.document.images[0].src = whichrun[stepshowit];
stepshowit++;
idshowit=window.setTimeout("showit("+whichrun+")",125);
}
else
{
clearTimeout(idshowit);
stepshowit=0;
}
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<MAP name="navmap">
<area shape=rect coords="0,0,560,434" onClick="showit(p)" nohref>
<area shape=rect coords="320,435,440,585" nohref>
<area shape=rect coords="450,435,550,585" nohref>
</MAP>
<DIV class="runcss">
<img src="img/intro_0.gif" name=animation usemap="#navmap" width=560 height=720 border=0>
</DIV>
</BODY>
</HTML>
Hallo,
idshowit=window.setTimeout("showit("+whichrun+")",125);
...
leider funktioniert es nicht.
ich nehmee an das problem liegt bei der uebergabe der funtions-parameter in setTimeout.
ich weiss, das der funktionsaufruf als string übergeben werden muss.
Probiere es so:
idshowit=window.setTimeout(function(){showit(whichrun)},125);
MfG, Thomas
Lieber Thomas,
danke für den tip:
Probiere es so:
idshowit=window.setTimeout(function(){showit(whichrun)},125);
wunderbar, sieht aus, als könnte man so die klippe elegant umschiffen!
klappt im IE5 aber trotzdem nicht. mir ist nicht klar, wie function()
arbeitet (eine vordefinierte funktion in js?).
vielleicht käme ich sonst selbst auf die lösung.
kannst du mir das kurz erläutern?
danke!
Hallo,
Probiere es so:
idshowit=window.setTimeout(function(){showit(whichrun)},125);
klappt im IE5 aber trotzdem nicht.
Bei mir schon.
var stepshowit = 0;
var a = new Array("a", "b", "c", "d");
showit(a);
function showit(whichrun) {
var m = whichrun.length;
if (stepshowit < m) {
alert(whichrun[stepshowit]);
stepshowit++;
//idshowit=window.setTimeout("showit(a)", 125);
idshowit=window.setTimeout(function () {showit(whichrun);}, 125);
} else {
clearTimeout(idshowit);
stepshowit=0;
}
}
Der oben stehende Code funktioniert in beiden Variationen.
Zunächst, warum Deine Methode nicht funktionieren konnte:
Mit "showit(" + whichrun + ")" verkettest Du die String-Entsprechung des Arrays whichrun, also "a, b, c, d". Das ergibt: "showit(a, b, c, d)" und die fehlermeldung, dass b nicht definiert ist.
Mit "showit(a)" funktioniert es, weil a eine globale Variable ist.
mir ist nicht klar, wie function()
Mit window.setTimeout("showit(whichrun)", 125) würde es nicht funktionieren, weil die Variable whichrun nach den 125 ms bereits nicht mehr zur Verfügung steht.
Der Aufruf von function definiert eine Funktion ;-). Mit function () wird eine namenlose Funktion definiert. In den geschweiften Klammern danach steht der Funktionskörper, also die Anweisungen, die bei Funktionsaufruf ausgefürt werden.
Mit window.setTimeout(function () {showit(whichrun);}, 125) wird im Speicher eine neue namenlose Funktion abgelegt, welche als einzige Anweisung die Funktion showit mit dem Parameter der hier noch bekannten Variablen whichrun aufruft. Nach den 125 ms wird _diese_ Funktion aufgerufen. Innerhalb _dieser_ ist whichrun bekannt.
viele Grüße
Axel
Hallo Axel,
danke vielmals für deine ausführliche antwort!
Der oben stehende Code funktioniert in beiden Variationen.
meine "testreihe" hat das nicht bestätigt.
Mit "showit(a)" funktioniert es, weil a eine globale Variable ist.
genau, so dachte ich mir das auch, das problem ist nur, dass ich eben
nicht auf ein bestimmtes array festgelegt sein will, für das diese
funktion geschrieben ist. das würde bedeuten, dass ich für jede animation
(die ich als array anlege) eine neue showit-funktion schreibe.
nicht sehr elegant, oder?
Mit window.setTimeout(function () {showit(whichrun);}, 125) wird im Speicher eine neue
namenlose Funktion abgelegt, welche als einzige Anweisung die Funktion showit mit dem
Parameter der hier noch bekannten Variablen whichrun aufruft. Nach den 125 ms wird _diese_ »» Funktion aufgerufen. Innerhalb _dieser_ ist whichrun bekannt.
hmmm. aus irgendeinem grund frisst - zumindest IE 5.1 - die parameter aus (whichrun)
trotzdem nicht. es funktioniert bei mir immer noch nicht (mac).
und du hast es auf IE getestet und alles war ok?
ich suche weiter, womöglich ein ganz anderes problem.
jedenfalls nochmal danke!
schöne grüsse
angela
Hallo,
hmmm. aus irgendeinem grund frisst - zumindest IE 5.1 - die parameter aus (whichrun)
trotzdem nicht. es funktioniert bei mir immer noch nicht (mac).
^Hast Du keinen Computer? *sorry, duck*
Was genau passiert denn? Welche Fehlermeldungen werden ausgegeben? Es kann durchaus sein, dass der Mac die Speicherverwaltung für Scripte restriktiver handelt als die PCs. Das würde bedeuten, dass auch die neue Funktion _nur_ im Kontext der sie erzeugenden Funktion gültig ist und mit Ende dieser stirbt. Dann hättest Du den selben Effekt, wie bei window.setTimeout("showit(whichrun)", 125). Fehler sollte dann nach den 125 ms sein: whichrun ist nicht definiert. Dann bleibt nur die Variante mit je einem globalen Array für jeden Vorgang. Du kannst ja den Namen des jeweiligen Arrays als zweiten Parameter in showit() mit übergeben und dann in
window.setTimeout("showit(" + name_des_arrays + ")", 125)
einverketten.
und du hast es auf IE getestet und alles war ok?
Ja, IE5.0, IE5.5, IE6.0 unter WinNT4.0 und Windows 2000.
viele Grüße
Axel