Angela: setTimeout, Funktions-Parameter verweist auf array

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>

  1. 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

    --
    SVG - Learning By Coding
    http://svglbc.datenverdrahten.de/
    1. 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!

      1. 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

        1. 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

          1. 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