Einem Objekt eine Eigenschaft hinzufügen
Michael
- javascript
Guten Morgen,
kann mir jemand auf die Sprünge helfen und nen Tipp geben, wie ich einem vorhandenem Objekt mit einer oder mehr Eigenschaften eine weitere hinzufügen kann.
Angenommen ich hab ein Formular ala:
<form name="f">
<input name="b" type="text" value="b" />
</form>
Wenn ich nun zusätzlich zu document.f.b noch document.f.a brauche, wie kann ich mir das mit js erzeugen?
if (!document.f.a)
document.f = new f2("das neue a", document.h.b.value);
function f2 (a, b) {
this.a = a;
this.b = b;
}
So gings schon mal nicht.
Danke und viele Grüße.
Michael
Hallo Michael,
Angenommen ich hab ein Formular ala:
<form name="f">
<input name="b" type="text" value="b" />
</form>
Wenn ich nun zusätzlich zu document.f.b noch document.f.a brauche, wie kann ich mir das mit js erzeugen?
zuerst solltest du dir hier http://de.selfhtml.org/javascript/objekte/document.htm und hier http://de.selfhtml.org/javascript/objekte/node.htm neue Inspiration holen. :-)
Tipp: Du möchtest ein neues Input-Element erzeugen und in das DOM "einhängen". (createElement(), appendChild()), desweiteren soll dein neues Input Element auch noch ein paar Attribute bekommen (setAttribute()).
Ich empfehle dir außerdem, dich einmal auf diesen Seiten umzuschauen: www.quirksmode.org. Der Menüpunkt W3C DOM -> W3C DOM Compatibility Tables -> Compatibility - Core
usw.
cu,
Michael
Hallo Michael,
danke für Deine Antwort, nur leider hilft mir das nicht weiter.
Ich brauch leider wirklich die Eigenschaft als Objekteigenschaft von dem document.h Objekt. Ein neues Element über DOM zu erzeugen wäre in dem Fall auch meine erste Idee gewesen, nur leider geht das in diesem Fall nicht (zumindest nicht so einfach wie sonst).
Ich habe in dem speziellen Fall nämlich eigentlich gar kein HTML in dem Sinn. Sondern ich bekomme in einem mehrstufigen Dialog die Formularobjekte von einem Programm via CGI angeliefert. Das entsprechende Dokument wird bei jedem Dialogschritt mit document.write zurückgeschriegen In einem Dialogschritt soll nun plötzlich eine Eigenschaft übergeben werden, die es nicht gibt.
Dazu habe ich mir einen try catch Block geschrieben um zu prüfen, ob es die Eigenschaft in dem Schritt gibt. Gibt es sie nicht, hätte ich sie eben gerne erzeugt.
greets,
Michael
Ich habe in dem speziellen Fall nämlich eigentlich gar kein HTML in dem Sinn. Sondern ich bekomme in einem mehrstufigen Dialog die Formularobjekte von einem Programm via CGI angeliefert. Das entsprechende Dokument wird bei jedem Dialogschritt mit document.write zurückgeschriegen In einem Dialogschritt soll nun plötzlich eine Eigenschaft übergeben werden, die es nicht gibt.
Ich verstehe das nicht. Kann es sein, dass dein Problem serverseitig ist?
Dazu habe ich mir einen try catch Block geschrieben um zu prüfen, ob es die Eigenschaft in dem Schritt gibt. Gibt es sie nicht, hätte ich sie eben gerne erzeugt.
Eine Eigenschaft läßt sich einfach mit if(objekt.eigenschaft) prüfen, aber nach wie vor ist die Frage was du überhaupt erzeugen willst.
Struppi.
Hallo,
Ich verstehe das nicht. Kann es sein, dass dein Problem serverseitig ist?
Indirekt. Will heissen: kann schon sein, dass das CGI-Programm an der Stelle einen Fehler hat. (Den in dem 2000 Zeilen langen unkommentierten C-Programm zu finden und zu beseitigen steht für mich aber vorerst mal nicht zu Diskussion.)
Das Programm verarbeitet Daten die es aus einem hidden Formular erhält.
Dazu bezieht die Schnittstelle (die an den Client mehr oder weniger via html mit document.write ausgeliefert wird) an dem dem entsprechenden Schritt erstmal das "Formularobjekt" ala
<FORM name="f2" ACTION="./programm.cgi" METHOD="get">
$$hidden$$
</FORM>
Die Werte der Eigenschaften von f2 werden dann überschrieben indem Werte aus einem "normalen" sichtbaren Formular f an das hidden Formular übergeben werden. F hat bei einem Schritt eine Eigenschaft, die f2 nicht hat, dadurch kam es im originalen Programmablauf zu einem Fehler, an dem dann nichts mehr weiter ging, nämlich als das gemacht hätte werden sollen:
document.f2.a = document.f.a;
Den hab ich dann mal abgefangen und den Schritt einfach weggelassen, falls es f2.a nicht gibt.
Nun würde es mich aber interessieren, ob dann später irgendwo der Wert von f2.a fehlt.
Deshalb hätte ich mal probiert, ein neues Objekt mit allen Eigenschaften und Werten von f zu erzeugen und mit dem dann f2 zu überschreiben... naja das hat natürlich nicht geklappt.
Eine Eigenschaft läßt sich einfach mit if(objekt.eigenschaft) prüfen, aber nach wie vor ist die Frage was du überhaupt erzeugen willst.
Hoffe, es ist nun einigermaßen verständlich??? (try catch passte mir hier irgendwie besser ins Konzept... aber im Prinzip wäre das ja Jacke wie Hose)
viele Grüße
Michael
Ich verstehe das nicht. Kann es sein, dass dein Problem serverseitig ist?
Indirekt. Will heissen: kann schon sein, dass das CGI-Programm an der Stelle einen Fehler hat. (Den in dem 2000 Zeilen langen unkommentierten C-Programm zu finden und zu beseitigen steht für mich aber vorerst mal nicht zu Diskussion.)
Das Programm verarbeitet Daten die es aus einem hidden Formular erhält.
Dazu bezieht die Schnittstelle (die an den Client mehr oder weniger via html mit document.write ausgeliefert wird) an dem dem entsprechenden Schritt erstmal das "Formularobjekt" ala
<FORM name="f2" ACTION="./programm.cgi" METHOD="get">
$$hidden$$
</FORM>
Sehr merküwrdiges vorgehen.
Die Werte der Eigenschaften von f2 werden dann überschrieben indem Werte aus einem "normalen" sichtbaren Formular f an das hidden Formular übergeben werden. F hat bei einem Schritt eine Eigenschaft, die f2 nicht hat, dadurch kam es im originalen Programmablauf zu einem Fehler, an dem dann nichts mehr weiter ging, nämlich als das gemacht hätte werden sollen:
document.f2.a = document.f.a;
Das Problem ist deine Definition von Eigenschaft, du meinst vermutlich ein Formularelement, also musst f2 dieses Element hinzufügen und das geht nur mit createElement() und appendChild(...) oder du erzeugst es bei der Ausgabe.
Deshalb hätte ich mal probiert, ein neues Objekt mit allen Eigenschaften und Werten von f zu erzeugen und mit dem dann f2 zu überschreiben... naja das hat natürlich nicht geklappt.
Ein Objekt ist ja nicht gleichbedeutend mit einem Formularobjekt, kann es sein, dass du da as verwchselst, weil der IE immer Object anzeigt wenn du dir z.b. dein document.f.a ausgibst?
FF zeigt in diesem Fall [HTML...Field] an (weiß jetzt den Wortlaut nicht), d.h. du kommst mit einem Objekt nicht weiter, da es auch gar nicht mit dem Formular mitgeschickt werden kann.
Eine Eigenschaft läßt sich einfach mit if(objekt.eigenschaft) prüfen, aber nach wie vor ist die Frage was du überhaupt erzeugen willst.
Hoffe, es ist nun einigermaßen verständlich??? (try catch passte mir hier irgendwie besser ins Konzept... aber im Prinzip wäre das ja Jacke wie Hose)
nur das try ... catch in wesentlich wenigern Browsern funktionert (allerdings in allen die createElement können), aber soweit ich weiß setzt man sowas nur ein, wenn du in den tiefen einer Aufgabe mit execptions schmeißt, du sparst dir dadurch in jeder Funktion alle Rückgabewert zu prüfen und kannst direkt zum Hauptaufruf zurückkehren. Aber um lediglich eine Eigenschaft zu prüfen, ist dieses absoluter overkill und IMHO auch falsch angewandt.
Struppi.
Hallo Struppi,
danke erstmal für Deine Tipps!
Das Problem ist deine Definition von Eigenschaft, du meinst vermutlich ein Formularelement...
Aus DOM Sicht schon. Aber aus Sicht von Javascript hätte ich eigentlich gedacht, dass es eine Eigenschaft eines Objektes ist.
... also musst f2 dieses Element hinzufügen und das geht nur mit createElement() und appendChild(...) oder du erzeugst es bei der Ausgabe.
Das hab ich probiert, aber es geht nicht. Vielleicht hab ich ja da einen Fehler drin?:
var ta = document.createElement("textarea");
var av = document.createAttribute("value");
var an = document.createAttribute("name");
var derName = document.createTextNode("a");
var ang = an.appendChild(derName);
var taav = ta.appendChild(av);
var taavang = taav.appendChild(ang);
document.h.appendChild(taavang);
FF wirft mir folgenden Fehler:
"Fehler: uncaught exception: [Exception... "Modifications are not allowed for this document" code: "7" nsresult: "0x80530007 (NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR)"
greets
Michael
hi,
Das hab ich probiert, aber es geht nicht. Vielleicht hab ich ja da einen Fehler drin?:
ich verstehe den sinn nicht.
var an = document.createAttribute("name");
du hast also jetzt ein attribut name erzeugt.
var derName = document.createTextNode("a");
hier erzeugst du einen link.
var ang = an.appendChild(derName);
wie bitte willst du an eine name-attribut einen textlink dranhängen?
(an als attribut kennt vermutlich gar keine methode appenChild.)
gruß,
wahsaga
Hallo wahsaga.
var derName = document.createTextNode("a");
hier erzeugst du einen link.
Bitte?
Einen schönen Dienstag noch.
Gruß, Ashura
hi,
var derName = document.createTextNode("a");
hier erzeugst du einen link.
Nein einen Textknoten für den Wert des Attributs.
var ang = an.appendChild(derName);
wie bitte willst du an eine name-attribut einen textlink dranhängen?
Wiso Textlink??? - das ist doch einfach nur ein String "a".
(an als attribut kennt vermutlich gar keine methode appenChild.)
wiso sollte ein Attributknoten kein Kind haben können?
Vielleicht denke ich da zu sehr in XML. Aber da ist Attributwert in einem Textknoten.
greets
Michael
hi,
hier erzeugst du einen link.
Nein einen Textknoten für den Wert des Attributs.
ja, ihr habt recht - beidäugige blindheit meinerseits.
gruß,
wahsaga
Das Problem ist deine Definition von Eigenschaft, du meinst vermutlich ein Formularelement...
Aus DOM Sicht schon. Aber aus Sicht von Javascript hätte ich eigentlich gedacht, dass es eine Eigenschaft eines Objektes ist.
Wie gesagt ein Object ist erstmal alles, aber du erwartest ja bestimmte Verhaltensweisen oder Darstellungen.
Ein Object ist aber lediglich ein Container mit ganz wenigen Methoden sonst nichts.
... also musst f2 dieses Element hinzufügen und das geht nur mit createElement() und appendChild(...) oder du erzeugst es bei der Ausgabe.
Das hab ich probiert, aber es geht nicht. Vielleicht hab ich ja da einen Fehler drin?:
var ta = document.createElement("textarea");
var av = document.createAttribute("value");
var an = document.createAttribute("name");
var derName = document.createTextNode("a");
var ang = an.appendChild(derName);
var taav = ta.appendChild(av);
var taavang = taav.appendChild(ang);
document.h.appendChild(taavang);
in einem normalen HTML Dokument kannst du eigenschaften auch ganz einfach zuweisen:
obj.atr = value;
var ta = document.createElement("textarea");
ta.value = ?????
sowie ich das sehe brauchst du da erst mal gar nicht. Zumal eine textarea ja sowieso schon per se eine Eigenschaft value hat.
ta.name = 'a';
und dann dem Formular zufügen.
document.h.appendChild(ta);
ist h das Formular?
Struppi.
Hallo,
in einem normalen HTML Dokument kannst du eigenschaften auch ganz einfach zuweisen:
obj.atr = value;var ta = document.createElement("textarea");
ta.value = ?????
sowie ich das sehe brauchst du da erst mal gar nicht. Zumal eine textarea ja sowieso schon per se eine Eigenschaft value hat.ta.name = 'a';
und dann dem Formular zufügen.
document.h.appendChild(ta);
ist h das Formular?
Danke Struppi, so funktionierts natürlich. Da hab ich mal wieder um 12 Ecken gedacht und den Wald vor lauter Bäumen nicht mehr gesehen. Im nachhinein ja völlig einleuchtend, dass ne textarea, nachdem ich sie als Element erzeugt habe ja die Eigenschaften mitbringt.
1000 Dank nochmal, natürlich auch an alle Anderen
greets
Michael
Hallo,
Ich verstehe das nicht. Kann es sein, dass dein Problem serverseitig ist?
Indirekt. Will heissen: kann schon sein, dass das CGI-Programm an der Stelle einen Fehler hat. (Den in dem 2000 Zeilen langen unkommentierten C-Programm zu finden und zu beseitigen steht für mich aber vorerst mal nicht zu Diskussion.)
ok, verständlich. (Dieses Programm läuft auf dem Server!)
Das Programm verarbeitet Daten die es aus einem hidden Formular erhält.
auf dem Server.
Dazu bezieht die Schnittstelle (die an den Client mehr oder weniger via html mit document.write ausgeliefert wird) an dem dem entsprechenden Schritt erstmal das "Formularobjekt" ala
Welche Schnittstelle? Ein JavaScript auf dem Client?
<FORM name="f2" ACTION="./programm.cgi" METHOD="get">
$$hidden$$
</FORM>
Die Werte der Eigenschaften von f2 werden dann überschrieben indem Werte aus einem "normalen" sichtbaren Formular f an das hidden Formular übergeben werden. F hat bei einem Schritt eine Eigenschaft, die f2 nicht hat, dadurch kam es im originalen Programmablauf zu einem Fehler, an dem dann nichts mehr weiter ging, nämlich als das gemacht hätte werden sollen:
document.f2.a = document.f.a;
Ein Input_Element hat von Haus aus schon alle Eigenschaften die es gibt, sobald es (vom Browser) erzeugt wurde, auch wenn du den Attributen etc. keine expliziten Werte zuweist, allerdings von Browser zu Browser durchaus verschieden. (Ich hoffe das stimmt, kann es grade nicht nachprüfen)
Was du hier imho versuchst, ist ein Node-Objekt zu kopieren. Diesbezüglich hatte ich dir bereits einen Link gegeben. In Wirklichkeit möchtest du aber wohl nur den Wert eines Attributes kopieren.
Das hat übrigens sehr wohl etwas mit dem DOM zu tun, denn auch dein document.write schreibt ja eben in ein document-Objekt (neues/separates Fenster?).
Leider verstehe ich immer noch nicht wirklich was du machen willst, vielleicht wäre ein besseres Beispiel hilfreich.
Anmerken möchte ich noch, dass du natürlich erst dann auf die Eigenschaften/Methoden des DOM's zugreifen kannst, wenn die Seite vollständig gerendert ist, also wenn deine document.write() - Folgen abgeschlossen sind.
Eine Eigenschaft läßt sich einfach mit if(objekt.eigenschaft) prüfen, aber nach wie vor ist die Frage was du überhaupt erzeugen willst.
Das frage ich mich auch. ;)
cu,
Michael
kann mir jemand auf die Sprünge helfen und nen Tipp geben, wie ich einem vorhandenem Objekt mit einer oder mehr Eigenschaften eine weitere hinzufügen kann.
Angenommen ich hab ein Formular ala:
<form name="f">
<input name="b" type="text" value="b" />
</form>
Wenn ich nun zusätzlich zu document.f.b noch document.f.a brauche, wie kann ich mir das mit js erzeugen?
document.f.a = new Object();
Was aber sinnfrei ist, du müßtest schon sagen was du wirklich machen willst.
Struppi.