Hallo, kann mir jemand sagen, wie man bei einer dynamisch erzeugten Combobox (<SELECT>) das Attribut "onchange" setzt? ich habe es mit TDwidget.onchange="..." probiert, hat aber nicht funktioniert. Die dort angegebene Funktion wird nicht aufgerufen. Vielen Dank, Ralf.
Hallo
kann mir jemand sagen, wie man bei einer dynamisch erzeugten Combobox (<SELECT>) das Attribut "onchange" setzt? ich habe es mit TDwidget.onchange="..." probiert, hat aber nicht funktioniert. Die dort angegebene Funktion wird nicht aufgerufen.
Dynamisch erzeugt? Wie sieht dieses dynamisch praktisch aus? Von einer dynamischen Erzeugung mittels eines CGI-Scriptes oder durch Ausgabe von HTML-Code mittels Javascript redest Du offenbar nicht. Denn dann waere es letztendlich simpler HTML-Code und da taucht dann keinerlei Schwierigkeit in dieser Beziehung auf. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
Am Dienstag, 24. Juni 2003 13:37 schrieb Bodo Kaelberer:
Hallo Dynamisch erzeugt? Wie sieht dieses dynamisch praktisch aus? Von einer dynamischen Erzeugung mittels eines CGI-Scriptes oder durch Ausgabe von HTML-Code mittels Javascript redest Du offenbar nicht. Denn dann waere es letztendlich simpler HTML-Code und da taucht dann keinerlei Schwierigkeit in dieser Beziehung auf.
Der Code sieht folgendermassen aus: var TR = document.getElementById("artikel").insertRow (rows); var TD2 = document.createElement ("td"); var TD2widget = document.createElement ("select"); TD2.align = "center"; TD2widget.name = "menge" + index; TD2widget.size = "1"; TD2widget.width = "250"; TD2widget.onchange = "quantityChanged(this)" initQuantity (TD2widget); TD2.appendChild(TD2widget); TR.appendChild(TD2); Es wird also zuerst eine neue Zeile in einer Tabelle erzeugt und dann ein <td>-Element, das eine Auswahlliste (<select>) enthält. Und so, wie ich für TD2widget die Attribute name, size und width setze, möchte ich das auch für den onchange-EventHandler tun. Aber so wie oben funktioniert's leider nicht. Irgendeine Idee? Viele Grüße, Ralf.
Hi
Der Code sieht folgendermassen aus:
var TR = document.getElementById("artikel").insertRow (rows);
var TD2 = document.createElement ("td"); var TD2widget = document.createElement ("select"); TD2.align = "center"; TD2widget.name = "menge" + index; TD2widget.size = "1"; TD2widget.width = "250"; TD2widget.onchange = "quantityChanged(this)" initQuantity (TD2widget); TD2.appendChild(TD2widget);
TR.appendChild(TD2);
Es wird also zuerst eine neue Zeile in einer Tabelle erzeugt und dann ein <td>-Element, das eine Auswahlliste (<select>) enthält. Und so, wie ich für TD2widget die Attribute name, size und width setze, möchte ich das auch für den onchange-EventHandler tun. Aber so wie oben funktioniert's leider nicht.
Irgendeine Idee?
Kaum. Ich hatte mich mal mit dHTML beschaeftigt, als es mit Netscape4 und IE 4 aufgekommen ist. Damals muesste man fuer jede neue Browserversion eine neue Implementierung machen und daraus hab ich die Konsequenz gezogen, es sein zu lassen. Für welchen Browser ist Dein Code? Oder hat man sich mittlererweile tatsaechlich auf einen browser-uebergreifenden Standard geeinigt? Zum Problem: Ich nehme mal an, es funktioniert prinzipiell, also die Breite ist tatsaechlich 250 etc. Dann gehe ich auch mal davon aus, dass ein onchance-Attribut tatsaechlich existiert. Dann ist die Frage wohl die, was man dem zuweisen muss. Hast Du mal statt einem Funktionsaufruf etwas Code zugewiesen, der direkt eine Aktion bewirkt z.b. TD2widget.onchange = "alert( \"klappt\" )" Oder versuch mal eine Funktion selbst zuzuweisen und nicht den Aufruf einer Funktion. Das koennte etwa folgendermassen funktionieren: function changeDone( object ) { } TD2widget.onchange = changeDone; Und noch zwei Workarounds: 1. Erzeuge auf konventionelle Weise (HTML) eine Select-Box mit einem onchange-Attribut, nimm Dir diese (in der Idee eines Templates) und wandele sie so ab, dass sie fuer dich passend ist. Du koenntest vielleicht auch, indem Du ein solches Objekt untersuchst, herausfinden, was in einer korrekt funktionierenden Select-Box als onchange-Wert verwendet wird. In etwa var nmySelect = document.getElementById("meineSelectBox"); alert( nmySelect.onchange ); 2. Erzeuge es "halbdynamisch", indem Du den HTML-Code per Javascript ausgibst. (document.writeln(...)). Das ist aber alles geraten. Wahrscheinlich gibt es eine ganz simple Loesung, wenn man weiss, welche (-; Laut SELFHTML8.0 fuer das DOM-Modell: document.getElementsByName("Eingabe")[0].addEventListener("click", handleEingabefeldClick, true); Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
Am Dienstag, 24. Juni 2003 14:32 schrieb Bodo Kaelberer:
Für welchen Browser ist Dein Code? Oder hat man sich mittlererweile tatsaechlich auf einen browser-uebergreifenden Standard geeinigt?
Entwickelt habe ich ihn mit Mozilla 1.3. Aufgrund Deiner Mail habe ich mir den Code mal mit Opera 6.0.3 und Konqueror 3.1.1 angeschaut und das Ergebnis war erschreckend!!! Im Konqueror funktioniert fast die komplette Funktionalität, nur werden Buttons zu schmal dargestellt (Breite=1). In Opera scheint alles dynamische nicht zu funktionieren (z.B. dynamisch Einträge in eine Combobox einfügen) :-(
Zum Problem: Ich nehme mal an, es funktioniert prinzipiell, also die Breite ist tatsaechlich 250 etc. Dann gehe ich auch mal davon aus,
In Mozille: Ja. Sonst: Nein :-(
dass ein onchance-Attribut tatsaechlich existiert. Dann ist die Frage wohl die, was man dem zuweisen muss. Hast Du mal statt einem Funktionsaufruf etwas Code zugewiesen, der direkt eine Aktion bewirkt z.b. TD2widget.onchange = "alert( \"klappt\" )"
Nein, ich hab's mittlerweile selbst rausgefunden: Im Mozilla funktioniert's mit TD2widget.setAttribute ("onchange", "quantityChanged(this)");
2. Erzeuge es "halbdynamisch", indem Du den HTML-Code per Javascript ausgibst. (document.writeln(...)).
Das was ich realisieren will, geht so glaub ich nicht. Ich habe eine Art Bestellformular. Am Anfang besteht dieses aus einer Zeile mit den Feldern Artikel (<select>), Menge (<select>), Einzelpreis (<td>) und Gesamtpreis (<td>). Unten drunter gibt es einen Button "Weitere", der eine weitere Zeile in die Tabelle einfügt. Wie kann man sowas realisieren, damit es mit verschiedenen Browsern funktioniert? Bleibt da nur Java übrig? Da hätte ich dann alle Freiheiten, oder? Oder man könnte es auch als CGI machen und jedes mal, wenn der Button gedrückt wird, die Seite neu laden. Ist aber auch nicht wirklich elegant. Hätte aber den Vorteil, dass ich z.B. aus einem Perl-Skript heraus "nur" HTML-Code generieren müsste. Kommentare hierzu?
Das ist aber alles geraten. Wahrscheinlich gibt es eine ganz simple Loesung, wenn man weiss, welche (-;
So ist es :-) Viele Grüße, Ralf.
Abend
Entwickelt habe ich ihn mit Mozilla 1.3. Aufgrund Deiner Mail habe ich mir den Code mal mit Opera 6.0.3 und Konqueror 3.1.1 angeschaut und das Ergebnis war erschreckend!!!
Also alles wie frueher (-;
Das was ich realisieren will, geht so glaub ich nicht. Ich habe eine Art Bestellformular. Am Anfang besteht dieses aus einer Zeile mit den Feldern Artikel (<select>), Menge (<select>), Einzelpreis (<td>) und Gesamtpreis (<td>). Unten drunter gibt es einen Button "Weitere", der eine weitere Zeile in die Tabelle einfügt.
Wie kann man sowas realisieren, damit es mit verschiedenen Browsern funktioniert? Bleibt da nur Java übrig? Da hätte ich dann alle Freiheiten, oder?
Grob gesagt schon. Aber es wird viiiiel umstaendlicher. Und viele schaltem aus Sicherheitsgrunden Java aus und manche auch noch Javascript dazu. Eine Loesung mit Java oder dHTML wuerde ich nur in einem homogenen Umfeld (z.b. ein firmeninternes Intranet) verwenden.
Oder man könnte es auch als CGI machen und jedes mal, wenn der Button gedrückt wird, die Seite neu laden. Ist aber auch nicht wirklich elegant. Hätte aber den Vorteil, dass ich z.B. aus einem Perl-Skript heraus "nur" HTML-Code generieren müsste.
Kommentare hierzu?
Ich wuerde das so machen (allerdings mit PHP statt mit Perl). Du willst natuerlich wie jeder Entwickler eine coole Loesung und dHTML ist cool. Aber es macht ungeheuer viel Probleme. Ich weiss nur eine Loesung mittels dHTML, die mit den meisten Browser funktionieren koennte: Mach in die Seite soviele Select-Boxen rein, wie Du irgendwie brauchen koenntest (z.B. maximal 100 Artikel pro Bestellung, also 100 Select-Boxen) und setze sie alle auf unsichtbar (oder stell sie in einen unsichtbaren Layer...). Bei Bedarf plazierst Du sie dann und machst sie sichtbar. Plazieren und sichbar machen sollte mit 99% der gängigen Browser funktionieren. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
Moin, Am Die, 2003-06-24 um 13.40 schrieb Ralf Schneider:
Der Code sieht folgendermassen aus:
var TR = document.getElementById("artikel").insertRow (rows);
Neuer Rekord: Programmende nach 9 Bytes für den InternetExplorer. Der nix "getElementById". :-) Hier ein Schnipsel aus meinem Code: function obj(name) { if(document.all) return eval("document.all."+name); else return document.getElementById(name); } Den Rest deines Problems weiss ich auch nicht. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Dienstag, 24. Juni 2003 21:09 schrieb Joerg Rossdeutscher:
Moin,
Am Die, 2003-06-24 um 13.40 schrieb Ralf Schneider:
Der Code sieht folgendermassen aus:
var TR = document.getElementById("artikel").insertRow (rows);
Neuer Rekord: Programmende nach 9 Bytes für den InternetExplorer. Der nix "getElementById".
Bis zum Test im IE war ich noch nicht gekommen :-) Hab bisher nur unter Linux getestet (Mozilla, Konqueror, Opera).
Hier ein Schnipsel aus meinem Code:
function obj(name) { if(document.all) return eval("document.all."+name); else return document.getElementById(name); }
Das funktioniert, aber scheinbar kennt der IE auch createElement nicht. Kann mir jemand sagen, wie die entsprechende Funktion heißt? Vielen Dank, Ralf.
Am Donnerstag, 26. Juni 2003 09:29 schrieb Ralf Schneider:
Das funktioniert, aber scheinbar kennt der IE auch createElement nicht. Kann mir jemand sagen, wie die entsprechende Funktion heißt?
Es lag nicht an createElement sondern am Aufruf der add()-Methode der Liste (<select>). Wenn man hier einen Eintrag am Ende einfügen möchte, sieht das beim Netscape so aus add (item, null) und beim IE so add (item) wobei in beiden Fällen item mit createElement("option") erzeugt wurde. Jetzt bin ich aber wieder bei meinen "onchange"-Problem. Meine zwischenzeitliche Lösung mit TD2widget.setAttribute ("onChange", "quantityChanged(this)"); zeigt mit dem IE6 keinen Effekt. Die Funktion quantityChanged() wird nie durchlaufen. Hat jemand eine Idee, was dem IE hieran nicht gefällt? Vielen Dank, Ralf.
Ralf Schneider wrote:
Jetzt bin ich aber wieder bei meinen "onchange"-Problem. Meine zwischenzeitliche Lösung mit TD2widget.setAttribute ("onChange", "quantityChanged(this)"); zeigt mit dem IE6 keinen Effekt. Die Funktion quantityChanged() wird nie durchlaufen.
Hat jemand eine Idee, was dem IE hieran nicht gefällt?
Wenn ich http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/select.asp lese und den Punkt Events richtig verstehe, muesste TD2widget.onchange = quantityChanged( this ); gehen. PS: In der Zeitschrift iX vom Heise-Verlag hat grad ein Browseruebergreifendes Javascript-Tutorial angefangen. -- Have fun, Peter
Am Donnerstag, 26. Juni 2003 10:55 schrieb Peter Wiersig:
Wenn ich http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/select.as p lese und den Punkt Events richtig verstehe, muesste
TD2widget.onchange = quantityChanged( this );
gehen.
Würde ich auch so verstehen, funktioniert aber leider nicht. Wenn ich es so eingebe, steigt die Funktion an der Stelle aus. Setze ich den Teil nach dem = in Anführungszeichen (") tritt zwar kein Fehler auf, aber die Funktion wird auch nicht aufgerufen.
PS: In der Zeitschrift iX vom Heise-Verlag hat grad ein Browseruebergreifendes Javascript-Tutorial angefangen.
Oh, muss ich mir unbedingt mal anschauen. Liegt auch schon irgendwo hier rum. Ich muss nur noch Zeit finden, mal drin zu lesen :-) Viele Grüße, Ralf.
Am Donnerstag, 26. Juni 2003 10:55 schrieb Peter Wiersig:
Wenn ich http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/select.as p lese und den Punkt Events richtig verstehe, muesste
TD2widget.onchange = quantityChanged( this );
Ich hab's mittlerweile rausgefunden :-) MS hat doch recht (hätte ich auch nicht gedacht, dass ich das mal sage :-) Es muss heissen: TD2widget.onchange = quantityChanged; Es muss eine Referenz auf eine Funktion angegeben werden. Auf this kann ich dann innerhalb der Funktion zugreifen. Das zeigt dann auf das Element, das den Event ausgelöst hat. Viele Grüße, Ralf.
participants (4)
-
Bodo Kaelberer
-
Joerg Rossdeutscher
-
Peter Wiersig
-
Ralf Schneider