Array-Variable zusammen setzen
André Laugks
- javascript
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
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
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
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
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
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
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
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
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
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
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