Erweitern des Node-Objektes
blubb
- javascript
Hallo,
da ich gerne striktes DOM benutzen würde, wollte ich mir dem Komfort und der Sauberkeit des Codes halber einige Methoden zusätzlich mit ins Node-Objekt holen.
Beispielsweise möchte ich den Textnode eines Elementnodes ändern, was ja aber nur funktioniert, wenn's auch einen Textnode gibt :)
Der Code dazu sieht so aus:
--- schnipp
Node.prototype.editText = function(value) {
if(this.firstChild && this.firstChild.nodeType == 3)
return (this.firstChild.nodeValue = value);
return this.appendChild(document.createTextNode(value));
}
--- schnapp
Wenn ich jetzt z.B. mit document.getElementById("id").editText("text"); das besagte machen will, funktioniert das in Mozilla auch sehr schön. Konqueror und Opera scheinen das Node-Objekt aber gar nicht erst zu kennen? Irgendwelche "Workarounds" o.ä. verfügbar?
Hallo,
Wenn ich jetzt z.B. mit document.getElementById("id").editText("text"); das besagte machen will, funktioniert das in Mozilla auch sehr schön. Konqueror und Opera scheinen das Node-Objekt aber gar nicht erst zu kennen? Irgendwelche "Workarounds" o.ä. verfügbar?
Den Konquerolant (habe 3.1) kann man getrost in die Tonne treten und ich neige dazu seine Existens zu verdrängen.
Auch ist mir Opera eher ein Graus.
Während sich Mozilla wacker durch die DOM Conformance Test Suites mit seinen 685 Test beißt und dabei 14 Federn läßt, versagt der Opera ab Test 35 vollends und das (ES) Konquerolant mag nicht mal den aller ersten Test...
Vielleicht ist Dir mit http://forum.de.selfhtml.org/archiv/2004/9/t89727/ etwas geholfen.
Gruß aus Berlin!
eddi
gruss blubb,
Der Code dazu sieht so aus:
--- schnipp
Node.prototype.editText = function(value) {
...
}
--- schnapp... funktioniert das in Mozilla auch sehr schön. Konqueror und Opera scheinen
das Node-Objekt aber gar nicht erst zu kennen? ...
jeder browserhersteller darf selbst entscheiden, wieviel er vom konzept
der objektprototypen, welches so grundlegend fuer JavaScript ist, auf
die grundobjekte des DOM uebertraegt.
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec, machen
dazu keine klaren aussagen - bzw. ich habe es nicht richtig gelesen und/
oder verstanden.
interessant ist, das bei Dir "Node.prototype ..." funktioniert, ich habe,
glaube ich, fuer Mozilla immer den prototypen aller html-elemete genommen -
"HTMLElement.prototype ..." bzw. "Element.prototype ..."
fuer operas sollte das scripten des "(HTML)Element"-objektes ab der version
7.5(irgendwas) mittlerweile funktionieren - alle anderen browser unter-
stuetzen diesen eleganten ansatz leider nicht.
... Irgendwelche "Workarounds" o.ä. verfügbar?
vielleicht so, aus:
Node.prototype.editText = function(value) {
...
};
wird:
var nodeEditText = function(value) {
...
};
weisse jedem objekt die globale funktion "nodeEditText" in dem moment zu
(myObj.editText = nodeEditText;), in dem Du ueber die methode "editText"
verfuegen moechtest.
by(t)e by(t)e - peterS. - pseliger@gmx.net
你好 peterS.,
[...]
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec, machen
dazu keine klaren aussagen - bzw. ich habe es nicht richtig gelesen
und/oder verstanden.
Nein, das stimmt nicht. Die ECMAScript-Spec sagt eindeutig, dass ein
Objekt _immer_ implizit das prototype-Objekt referenziert und dass
Attribute, die dem Prototype-Objekt zugeordnet werden, sich auf alle Objekte
auswirkt.
Dass die DOM-Spec dazu nichts sagt, ist klar: DOM ist sprachunabhaengig :)
再见,
CK
gruss Christian,
[...]
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec, machen
dazu keine klaren aussagen - bzw. ich habe es nicht richtig gelesen
und/oder verstanden.Nein, das stimmt nicht. Die ECMAScript-Spec sagt eindeutig, dass ein
Objekt _immer_ implizit das prototype-Objekt referenziert und dass
Attribute, die dem Prototype-Objekt zugeordnet werden, sich auf alle Objekte
auswirkt.
richtig, und ich denke, dass damit eindeutig der ECMAScript-Sprachkern
gemeint ist.
Dass die DOM-Spec dazu nichts sagt, ist klar: DOM ist sprachunabhaengig :)
richtig, DOM und ECMAScript haben erst mal nichts miteinander zu tun.
blubb fragte aber dannach, in welchen browsern ECMAScript-spezifikationen
auch in das DOM implementiert wurden (prototypen von Node-objekten).
genau darauf habe ich geantwortet:
jeder browserhersteller darf selbst entscheiden, wieviel er vom konzept
der objektprototypen, welches so grundlegend fuer JavaScript ist, auf
die grundobjekte des DOM uebertraegt.
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec, machen
dazu ...
lag hier das missverstaendnis? - "dazu" bezieht sich doch eindeutig
auf die grauzone: "JavaScript-anbindung an DOM (bzw. umgekehrt)".
... keine klaren aussagen - bzw. ich habe es nicht richtig gelesen und/
oder verstanden.
by(t)e by(t)e - peterS. - pseliger@gmx.net
你好 peterS.,
[...]
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec,
machen dazu keine klaren aussagen - bzw. ich habe es nicht richtig
gelesen und/oder verstanden.Nein, das stimmt nicht. Die ECMAScript-Spec sagt eindeutig, dass ein
Objekt _immer_ implizit das prototype-Objekt referenziert und dass
Attribute, die dem Prototype-Objekt zugeordnet werden, sich auf alle
Objekte
auswirkt.richtig, und ich denke, dass damit eindeutig der ECMAScript-Sprachkern
gemeint ist.
Da steht nichts von Sprachkern, da steht nur, dass es so ist :) Objekte, die
sich nicht durch prototype erweitern lassen, handeln also dem Standard
zuwider.
jeder browserhersteller darf selbst entscheiden, wieviel er vom
konzept der objektprototypen, welches so grundlegend fuer JavaScript
ist, auf die grundobjekte des DOM uebertraegt.
sowohl die DOM-spezifikationen, als auch die ECMAScript-spec, machen
dazu ...lag hier das missverstaendnis? - "dazu" bezieht sich doch
eindeutig auf die grauzone: "JavaScript-anbindung an DOM (bzw.
umgekehrt)".
Es gibt da keine Grauzone. Der ECMA-Script-Standard ist an dieser Stelle
recht eindeutig. Da wird nicht von "Objekten im Sprachkern" geredet, sondern
ganz allgemein von Objekten aller Art.
再见,
CK
gruss Christian,
im schnelldurchlauf bin ich in allen 4 bislang veroeffentlichten ECMAScript-
spezifikationen immer noch nicht auf eine fuer mich eindeutige aussage zum
problem gestossen, aber dank Deiner hartnaeckigkeit habe ich google zum
thema "ECMASCript binding DOM" bemueht
http://www.google.com/search?num=20&hl=en&lr=lang_en&c2coff=1&as_qdr=all&q=ECMAScript+binding+DOM&btnG=Search&lr=lang_en
und bin unter anderem auf diese
interessanten sachen gestossen, die mir meine bisherige ahnungslosigkeit
deutlich vor augen fuehren -
http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html -
andererseits bedrueckt mich diese tatsache nicht so sehr, weil nicht nur
ich als laie schwierigkeiten beim verstaendnis von w3c-specs zu haben
scheine:
http://lists.xml.org/archives/xml-dev/200101/msg00557.html
"ECMAScript Language Binding" fuer DOM-Level-2 ist zwar nur eine empfehlung,
da diese aber nunmehr schon 4 jahre auf dem buckel hat, neige ich auch zur
ansicht, dass nur die entwicklergemeinde von mozilla in diesem punkt die
hausaufaufgaben richtig gemacht hat.
by(t)e by(t)e - peterS. - pseliger@gmx.net
Hallo,
fuer operas sollte das scripten des "(HTML)Element"-objektes ab der version 7.5(irgendwas) mittlerweile funktionieren
...nur wie? Selbst mit 7.60 Preview 3 war ich in meinen Tests nicht weit gekommen.
Mathias
gruss Mathias,
asche auf mein haupt - gestern war ueberhaupt nicht mein tag. ich weiss auch
nicht, was mich geritten hat, vermutungen statt fakten zu aeussern - eitelkeit
wahrscheinlich.
bei irgendeiner testreihe fuer browser lieferte mir "typeof Node" fuer den
Opera 7.54 "function" zurueck, was mich zur unueberprueften annahme
verleitete, das der dann auch mit "Node.prototype ..." keine probleme
mehr haben sollte - hat er aber, ausserdem liefert mir ein Opera 7.22
gerade dasselbe ergebnis - da hab ich also mal wieder voll ins klo gegriffen :-(
zerknirscht - peterS. - pseliger@gmx.net