onchange Attribut per Funktion zuweisen
huby
- javascript
0 Felix Riesterer0 huby
Hallo Leute,
folgendes Problem.
Mit Hilfe einer Funktion kann ich Tabellen dynamisch erweitern und, je nach Bedarf, in die neu erstellten Zellen entweder input, text oder select Objekte erstellen.
Die Informationen hierzu sind in einem Array hintelegt.
Leider hab ich es bis jetzt nicht hin gekriegt, dem Select-Object einen Funktionaufruf mit Parameter als onchange Attribut zuzuweisen.
objekt.setAttribute("onchange", myarray[i][1][zi-1][oi][3][0]);
funktioniert zwar, aber natürlich nicht im IE!
http://forum.de.selfhtml.org/archiv/2006/7/t133287/ Dieses Beispiel hat mich auch nicht ans Ziel gebracht, da ich nicht immer nur ein und dieselbe Function aufrufen will, sondern immer die, die in meinem Array hinterlegt ist.
Mein Lösungsansatz, wäre folgender:
Der Funktionsaufruf wird in myarray als Object hinterlegt:
{'table_add':[this.value,var_ents,'','',['h1c1','schalweg1','schal_weg1'],'','','ud',1]}
Jetzt könnte man mit einem verschachtelten Schleifendurchlauf den Functionsaufruf zusammenbauen.
Etwa so:
objekt.onchange = function () {
var onch;
for(key in myarray[i][1][zi-1][oi][3][0]) {
onch=key;
for(var fi=0; fi<myarray[i][1][zi-1][oi][3][0][key].length; fi++) {
onch=onch+ ?
}
}
};
Da bin ich dann mit meinem Latein am Ende!
Bin für jeden Tipp dankbar.
huby
Lieber huby,
{'table_add':[this.value,var_ents,'','',['h1c1','schalweg1','schal_weg1'],'','','ud',1]}
das muss ich jetzt nicht verstehen, oder? Anscheinend soll jedes Array-Element einen Zelleninhalt der neu zu erzeugenden Zeile werden. Oder addierst Du senkrecht?
objekt.onchange = function () {
var onch;
"onch" ist eine lokale Variable. Das ist gut.
for(key in myarray[i][1][zi-1][oi][3][0]) {
Warum muss "key" eine globale Variable werden? Das ist nicht gut. Und woher kennt die Funktion "myarray"?
onch=key;
"key" enthält einen String als Wert, alternativ einen numerischen Wert. "onch" soll doch wohl aber ein Funktionsaufruf werden, oder? Das wird mir jetzt nicht so ganz klar...
for(var fi=0; fi<myarray[i][1][zi-1][oi][3][0][key].length; fi++) {
onch=onch+ ?
[...]
Da bin ich dann mit meinem Latein am Ende!
Ich auch, da ich Deinen Lösungsansatz nicht wirklich verstanden habe.
Bin für jeden Tipp dankbar.
Lass mal nachdenken. Du willst eine Tabellenzeile generieren, deren Aufbau in einem Objekt definiert ist. In diesem Objekt stehen die Zelleninhalte vordefiniert - soweit ja klar. Was genau soll denn jetzt die onchange-Funktion jetzt bewirken? Das ist alles andere als klar.
Du schreibst einen bereits teilweise funktionierenden Lösungsansatz:
objekt.setAttribute("onchange", myarray[i][1][zi-1][oi][3][0]);
Hier rufst Du im Grunde eine Funktion auf, die in einer globalen Objektvariable (oder Array-Variable) gespeichert ist. Das funktioniert im IE zwar nicht, aber das kann man ja auch anders machen. Was passiert denn bei folgendem Code?
objekt.onchange = "myarray[i][1][zi-1][oi][3][0];"
Im Grunde genommen sollte dieser Code fast dasselbe bewirken, wie Dein obiger Ansatz.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix,
Danmke für Deine Antwort!
Inzwischen hab ich die Lösung gefunden.
Den Functionsaufruf hab ich wieder als String hinterlegt.
Also so =>
table_add(this.value,var_ents,'','',['h1c1','schalweg1','schal_weg1'],'','','ud',1)
Und jetzt nur noch:
if(myarray[i][1][zi-1][oi][3][0]) {
var func = myarray[i][1][zi-1][oi][3][0];
objekt.onchange = function () { eval(func) };
}
Bisher hatte ich es mit eval nur wie folgt probiert:
if(myarray[i][1][zi-1][oi][3][0]) {
objekt.onchange = function () { eval( myarray[i][1][zi-1][oi][3][0]) };
}
Das funktioniert aber nicht.
Das hängt wohl mit Closures zusammen und wird hier erklärt. =>
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/index.htm
Umfassend hab ich das zwar noch nicht verstanden, aber es hat trotzdem geholfen.
Vielen Dank für Deine Hilfe.
huby