André Laugks: Array-Variable zusammen setzen

Hallo!

Ich habe mehrere Arrays, in denen sich die IDs für Layer befinden.
Nach dem Laden der Seite möchte ich die Positionen alles Layer in eine Array schreiben. Ich könnte alle Werte auch von Hand in ein Array schreiben, was mir aber zu unflexibel ist. Ich habe von der hier aufgeführten Arrays, sechs Stück :-(. Zu jeder Array mit IDs gibt es eine für die Positionen, home_mp >>> unterne_mp_pos.

Problem ist, das dies hier nicht funktioniert:
eval(menue_global + "_mp_pos[i]"); ich bekomme also z.B. home_mp_pos[i] nicht zusammengesetzt. Einfach addieren kann ich es ja auch nicht, also menue_global + "_mp_pos[i]". Ich muß ja eval() verwenden, da ich keine String, sindern ein Objekt zusammen addiere, oder? Wie bekomme ich das nun "dynamisch" zusammen gesetzt? unterne_mp, home_mp kommen aus eine Ober-Array. Über zwei verschatelte Schleifen möchte dann alle sechs Array durchlaufen.

Wenn es sein muß, lege ich sechs Schleifen an, was aber uncool ist ;-).

var alle = new Array("unterne_mp", "home_mp", etc...);

var unterne_mp = new Array("mpportr", "mpleist", "mpstrat", "mpfacts", "mpjobs");
var unterne_mp_pos = new Array();

var home_mp = new Array("mph1", "mph2", "mph3");
var home_mp_pos = new Array();

for(var i = 0; i < eval(menue_global + "_mp[i].length"); i++)
{
  eval(menue_global + "_mp_pos[i]") = document.layers[eval(menue_global + "_mp[i]")].pageY;
}

So sollte es dann zum Schluß aussehen. Als Beispiel habe ich jetzt nur mal den NN-Teil aufgeführt.

for(var i = 0; i < alle.length; i++)
{
  for(var j = 0; j < eval(alle[i] + "_mp.length"); j++)
   {
    eval(alle[i] + "_mp_pos[j]") = document.layers[eval(alle[i] + "_mp[i]")].pageY;
   }
}

Danke und MfG, André Laugks

  1. Moin Nachteule ;-)

    Problem ist, das dies hier nicht funktioniert:
    eval(menue_global + "_mp_pos[i]"); ich bekomme also z.B. home_mp_pos[i] nicht zusammengesetzt. Einfach
    addieren kann ich es ja auch nicht, also menue_global + "_mp_pos[i]".

    also, wenn menue_global eine String-Variable ist, sollte obiger Ausdruck eigentlich
    etwas Vernünftiges zurückliefern, imho den *Inhalt* von z.B. home_mp_pos[i].

    Ich muß ja eval() verwenden, da
    ich keine String, sindern ein Objekt zusammen addiere, oder?

    Nicht ganz, eval() wird immer dann verwendet, wenn man Javascript-Ausdrücke
    ausführen lassen möchte, die nicht im Quelltext stehen sondern erst während
    der Ausführung aus String-Variablen zusammengesetzt werden. Selbstmodifizierender
    Code sozusagen, imho eine der großen Stärken von Scriptsprachen
    gegenüber Compiler-Sprachen (jaja... mit Ausnahme des Falles, daß man
    einen Script-Interpreter in einer Compilersprache schreibt ;-)).

    Wenn es sein muß, lege ich sechs Schleifen an, was aber uncool ist ;-).

    Falls Du Dir dann doch sechs Schleifen anlegen solltest, mach davon
    mal'n Foto und stell es ins Netz... ;-)

    for(var i = 0; i < eval(menue_global + "_mp[i].length"); i++)
    {
      eval(menue_global + "_mp_pos[i]") = document.layers[eval(menue_global + "_mp[i]")].pageY;
    }

    So sollte es dann zum Schluß aussehen. Als Beispiel habe ich jetzt nur mal den NN-Teil aufgeführt.

    for(var i = 0; i < alle.length; i++)
    {
      for(var j = 0; j < eval(alle[i] + "_mp.length"); j++)
       {
        eval(alle[i] + "_mp_pos[j]") = document.layers[eval(alle[i] + "_mp[i]")].pageY;
       }
    }

    Ich bin mir zunächst nicht ganz sicher, wo das Problem liegt, weil ich die
    Definitionen von menue_global[] bzw. alle[] nicht in Deinem Posting finde.
    Zunächst ist eval() in Ausdrücken wie

    feld[eval(stringvariable+"_anhaengsel")]

    überflüssig. Im Array-Index darf ja sowieso ein String stehen und ein
    zusammengesetzter String ist letztendlich auch ein String.
    Beim folgenden Ausdruck

    eval(alle[i]+"_mp_pos[j]") = ...;

    würde ich tippen, daß eval erst den Inhalt der Variable ersetzt und dann die Zuweisung
    ausgeführt wird. Wenn also alle[i] = "home" und home_mp_pos[j] = 4711, dann steht
    dort letztendlich sowas wie

    4711 = document.layers[...];

    also sicherlich nicht das, was Du willst.
    Mein Vorschlag: Bastel Dir einfach zuerst die gesamte Befehlszeile als String zurecht
    und laß dann genau ein eval darauf los, also etwa so:

    eval(alle[i]+"_mp_pos[j] = document.layers["+alle[i]+"_mp[i]].pageY);

    Viel Glück erstmal beim Probieren und bis dannundwann...

    Andreas

    1. Moin nochmal,

      eval(alle[i]+"_mp_pos[j] = document.layers["+alle[i]+"_mp[i]].pageY);

      hier hat natürlich der Fehlerteufel zugeschlagen, richtig wäre

      eval(alle[i]  +  "_mp_pos[j] = document.layers["  +  alle[i]  +  "_mp[i]].pageY");

      bduw...

      Andreas

    2. Hallo!

      Wenn es sein muß, lege ich sechs Schleifen an, was aber uncool ist ;-).

      Falls Du Dir dann doch sechs Schleifen anlegen solltest, mach davon
      mal'n Foto und stell es ins Netz... ;-)

      Das hättest Du gern <g>? Nene, das schaue ich mir ganz alleine vor dem Spiegel an. Das werden sechs süße rote Schleifchen im Haar sein.

      Ich bin mir zunächst nicht ganz sicher, wo das Problem liegt, weil ich die
      Definitionen von menue_global[] bzw. alle[] nicht in Deinem Posting finde.

      OK, ich glaube, ich habe auch etwas verwirrend geschrieben.

      Ich nehme mal etwas angepassten Code aus Deinem berichteten Posting<89987.html>.

      var menue = "unterne";
      Dieser String, könnte aus einer Array kommen. Hier als Beispiel mal ohne Array.

      Von diesen Arrays gibt es mehrere, für jedes Menü zwei, eins in der die IDs stehen und eine in der die top-Positionen gespeichert werden.
      var unterne_mp = new Array("mpportr", "mpleist", "mpstrat", "mpfacts", "mpjobs");
      var unterne_mp_pos = new Array();

      for(var i = 0; i < eval(menue + "_mp.length"); i++)
      {
        eval(menue  +  "_mp_pos[i] = document.layers["  +  menue  +  "_mp[i]].pageY");
      }

      alert(unterne_mp_pos.join(","));

      Leider bekomme ich hier diese Fehlermeldung, die ich nicht ganz nachverfolgen kann, bzw. den Fehler nicht erkenne.

      Die JS-Console von NN liefert dies:
      ----------------><8------------------------------------
      illegal character.

      eval(menue  +  "_mp_pos[i] = document.layers["  +  menue  +  "_mp[i]].pageY");
      ............^
      ----------------><8------------------------------------
      Die Frage ist, wo ist da eine illegaler Charakter/Zeichen?

      mfg, André Laugks

      1. Moin,

        Leider bekomme ich hier diese Fehlermeldung, die ich nicht ganz nachverfolgen kann, bzw. den Fehler nicht erkenne.

        Die JS-Console von NN liefert dies:
        ----------------><8------------------------------------
        illegal character.

        eval(menue  +  "_mp_pos[i] = document.layers["  +  menue  +  "_mp[i]].pageY");
        ............^
        ----------------><8------------------------------------
        Die Frage ist, wo ist da eine illegaler Charakter/Zeichen?

        ...kann ich jetzt nach mehreren Selbstversuchen mit eval(...) und irgendwelchen
        zusammengesetzten Befehlen auch nicht nachvollziehen. Hast Du Dein
        Skript irgendwo im Netz stehen (URL), so daß man es sich mal im ganzen
        angucken kann? Ich würde fast wetten, daß irgendwo ein ganz
        anderer Fehler steckt (vergessene Klammer, Semikolon, ", ...?), der mit dem eval()-Problem
        nicht unbedingt was zu tun hat. Eigentlich müßte es so funktionieren wie Du
        es schreibst. Wobei die Verwendung von Worten wie "eigentlich" und "müßte"
        im Zusammenhang mit Programmieren ja immer gefährlich ist ;-)

        Bis dannundwann

        Andreas

        1. Hallo!

          Hast Du Dein
          Skript irgendwo im Netz stehen (URL), so daß man es sich mal im ganzen
          angucken kann? Ich würde fast wetten, daß irgendwo ein ganz
          anderer Fehler steckt (vergessene Klammer, Semikolon, ", ...?), der mit dem eval()-Problem

          So, ich habe es mal online gestellt. Ich habe sämtlich Rollover-Sachen und das Script, welches das Menue(Explorerstill) aufklappt, rausgenommen. Ist glaube übersichtlicher. Der Fehler bleibt der selbe.

          http://www.netcologne.de/~nc-laugksan/futura/frames/navigation2.html

          Komischerweise sagt es nun noch, "init is not defined.". init ist eine Funktion. Ich schätze, das es sich um ein Folgefehler handelt.

          Danke fürs schauen!

          mfg, André Laugks

          1. Moin nochmal,

            ich zitiere mal aus Deinem Quellcode:

            ===8><==================================
            var ie = document.all;
            var nn = document.layers;

            var summe = new Array("unterne");
            var unterne_mp = new Array("mpportr", "mpleist", "mpstrat", "mpfacts", "mpjobs");
            var unterne_mp_pos = new Array();

            function init()
                {
                    for(var i = 0; i < summe.length; i++)
                        {
                            for(var x = 0; x < eval(summe[i] + ".length"); x++)
                                {
                                    if(nn) { eval(summe[i] +  "_mp_pos[x] = document.layers["  +  summe[i]  +  "_mp[x]].pageY"); }
                                    if(ie) { eval(summe[i] + "_mp_pos[x]= document.all[" + summe[i] + "_mp[x]].offsetTop;"); }
                                }
                        }
                
                alert(unterne_mp_pos.join(","));
                // Bei alert sollte nun dies zu sehen sein
                // 45,65,85,105,125  
                }

            ===8><==================================

            Wenn man in der inneren Schleife das eval() auflöst, kommt folgendes dabei heraus:

            for(var x = 0; x<unterne.length; x++) { ... }

            Das Problem daran: "unterne.length" existiert nicht, wohl aber unterne_mp.length!
            Der Fehler "invalid character", der weiter unten auftritt, ist offenbar ein Folgefehler
            davon. Wenn Du die Schleife umänderst in

            for(var x=0; x < eval(summe[i] + "_mp.length"); x++) { ... }

            sind die JS-Errors beseitigt, und das alert-Fenster erscheint so, wie Du es im Quelltext
            weiter unten angekündigt hattest. Den Fehler konnte ich übrigens erst sehen, als ich
            die eine Zeile in der Schleife in

            if (nn) { alert(summe[i] + ......); }

            verändert habe.
            Danach gab es zum ersten mal eine hilfreiche Fehlermeldung von Netscape ("unterne not defined").
            Warum diese Fehlermeldung vorher nicht kam, ist mir sehr rätselhaft - ein Folgefehler
            eines Fehlers verhindert sozusagen, daß vom ersten Fehler eine vernünftige Fehlermeldung
            erscheint. Ist das die künstliche Intelligenz von Javascript?! ;-)

            Bis dannundwann

            Andreas

            1. Hallo Andreas!

              Das Problem daran: "unterne.length" existiert nicht, wohl aber unterne_mp.length!

              Wenn Du den Schrei hättest hören können, den ich gerade von mir stieß. :-)

              Warum diese Fehlermeldung vorher nicht kam, ist mir sehr rätselhaft - ein Folgefehler
              eines Fehlers verhindert sozusagen, daß vom ersten Fehler eine vernünftige Fehlermeldung
              erscheint. Ist das die künstliche Intelligenz von Javascript?! ;-)

              <g>

              Vielen Dank und MfG, André Laugks

            2. Hi Andreas!

              Wenn man in der inneren Schleife das eval() auflöst, kommt folgendes dabei heraus:

              for(var x = 0; x<unterne.length; x++) { ... }

              Das Problem daran: "unterne.length" existiert nicht, wohl aber unterne_mp.length!
              Der Fehler "invalid character", der weiter unten auftritt, ist offenbar ein Folgefehler
              davon.

              Glaube ich nicht. Das eval wird ja erst zur Laufzeit ausgefuehrt, der illegal character wird aber schon zur "Kompilier"-(or whatever)-Zeit festgestellt. Das heisst uebrigens, dass da tatsaechlich ein illegal character ist, sowas wie ein Backspace oder ein Null-Zeichen oder aehnliches (was man nicht sieht). Sowas kann aus mir nicht ganz nachvollziehbaren Gruenden manchmal beim Copy&Pasten entstehen. Abhilfe schafft hier meist nur Loeschen der Zeile und Neuschriebn. (Vielleicht reicht auch schon loeschen aller Zeichen, die wie Leerzeichen aussehen.) Dass die sub init nicht defined ist, ist dann ein Folgefehler davon, da sie nicht erfolgreich geparst werden konnte.

              Uebrigens kann man auch mit
                var x_mp = eval(summe[i] + "_mp");
                var x_mp_pos = eval(summe[i] + "_mp_pos");
              innerhalb der aeusseren for-Schleife am Anfang die beiden jeweiligen Arrays nach x_* spiegeln (nicht kopieren) und dann mit z.B.
                if (nn) x_mp_pos[x] = document.layers[x_mp[x]].pageY;
              darauf zugreifen.

              So long

              1. Moin,

                Glaube ich nicht. Das eval wird ja erst zur Laufzeit ausgefuehrt,
                der illegal character wird aber schon zur "Kompilier"-(or
                whatever)-Zeit festgestellt. Das heisst uebrigens, dass da
                tatsaechlich ein illegal character ist, sowas wie ein Backspace
                oder ein Null-Zeichen oder aehnliches ...

                das kann in diesem Fall aber nicht sein: Sobald der
                Fehler im for(...)-Statement bereinigt wurde, verschwand
                auch der 'illegal character'. Ich kann mir noch vorstellen, daß
                aufgrund des vorigen Fehlers evtl. die Variable
                summe[i] auf einen ungütigen String zeigte, was dann den
                Fehler auslöste.
                Probier mal die Seite, die Andre als URL gegeben hat mit
                Netscape 4.x, und Du wirst sehen ;-)

                Bis dannundwann

                Andreas

                1. ReMoin!

                  das kann in diesem Fall aber nicht sein: Sobald der
                  Fehler im for(...)-Statement bereinigt wurde, verschwand
                  auch der 'illegal character'.

                  Nun, er verschwand *auch*, aber *deswegen*?
                  Ich habe die Datei jetzt mal runtergeladen, und tatsaechlich steht an der betreffenden Stelle (und an zehn weiteren Stellen in der Gegend) das Zeichen 0xA0 (ASCII 160), was dort offenbar nicht geduldet wird. Vermutlich hast Du bei Deinen Aenderungen diese Zeichen entfernt, vielleicht hat sie auch Dein Editor automatisch ersetzt. Das einfach Einfuegen des fehlenden _mp hat bei mir jedenfalls die Fehler nicht beseitigt.

                  Ich kann mir noch vorstellen, daß
                  aufgrund des vorigen Fehlers evtl. die Variable
                  summe[i] auf einen ungütigen String zeigte, was dann den
                  Fehler auslöste.

                  Nun, die function init gibt es laut der zweiten Fehlermeldung ueberhaupt nicht, sie wird also auch niemals ausgefuehrt, und die logischen Fehler darin koennen somit noch gar nicht auffallen. Und wie gesagt, den Grund fuer das Nichtvorhandensein von init sehe ich darin, dass aufgrund der illegal characters die Funktion nicht vollstaendig geparst wurde. Ich kann das jetzt leider nicht ueberpruefen, da ich keine Hex-Editor zur hand habe, und zum Neuschreiben der betreffenden Zeilen bin ich zu faul, aber ich wuerde Dich oder André mal bitten, dies zu probieren, und dabei den logischen Fehler (fehlendes _mp) drin zu lassen. Ich bin ziemlich sicher, dass die init dann ausgefuehrt wird, aber dann eben ueber das fehlende unterne.length gemeckert wird.

                  So long