form.style manchmal ambivalent?
Felix Riesterer
- javascript
1 ChrisB1 Cheatah
Liebe Mitlesende,
heute stehe ich vor einem theoretischen JavaScript-Rätsel, das ich nicht lösen kann. Es geht darum was passiert, wenn man in einem Formular einem Eingabeelement den Namen "style" gibt.
Eingabeelemente kann man in JavaScript direkt über <formElementobjekt>.<Elementname> http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=ansprechen, z.B. document.forms[0].benutzername
. Aber was passiert, wenn ein Formularelement den Namen einer Eigenschaft des <form>-Elementobjektes trägt? Im Falle von "style" wird im FF (erster Test nur im FF) das style-Objekt des <form>-Elementobjektes überschrieben (Praxistest).
Das Überschreiben irritiert mich nicht sonderlich, das leuchtet mir ein. Was mir dagegen nicht einleuchtet, das ist die Tatsache, dass sich die Darstellung nicht ändert, sondern dass stattdessen die vorherigen CSS-Deklarationen beibehalten werden. Wenn sie das werden, dann müsste man deren Werte doch irgendwie wieder auslesen und neu beschreiben können, oder nicht? Wenn ja, wie bzw. wo?
Liebe Grüße,
Felix Riesterer.
Hi,
Das Überschreiben irritiert mich nicht sonderlich, das leuchtet mir ein. Was mir dagegen nicht einleuchtet, das ist die Tatsache, dass sich die Darstellung nicht ändert, sondern dass stattdessen die vorherigen CSS-Deklarationen beibehalten werden.
Warum sollte es anders sein?
Lediglich die *Referenz* auf das style-Objekt wird doch überschrieben.
Wenn sie das werden, dann müsste man deren Werte doch irgendwie wieder auslesen und neu beschreiben können, oder nicht?
Weiß nicht, ob ich dich richtig verstehe.
Neu setzen über das style-Objekt kannst du sie nicht, wenn du auf dieses keine Referenz mehr vorliegen hast.
MfG ChrisB
Lieber ChrisB,
dass stattdessen die vorherigen CSS-Deklarationen beibehalten werden.
Lediglich die *Referenz* auf das style-Objekt wird doch überschrieben.
Verstehe ich Dich richtig, dass für die JS-Engine die CSS-Eigenschaften erhalten bleiben und dass lediglich mein Zugang über die API "zerstört" ist?
Neu setzen über das style-Objekt kannst du sie nicht, wenn du auf dieses keine Referenz mehr vorliegen hast.
Jetzt erscheint mir das logisch. Danke!
Liebe Grüße,
Felix Riesterer.
Hi,
Verstehe ich Dich richtig, dass für die JS-Engine die CSS-Eigenschaften erhalten bleiben und dass lediglich mein Zugang über die API "zerstört" ist?
Die JS-Engine hat ja mit CSS erst mal wenig am Hut - eher die Rendering-Engine.
Per JS kannst du lediglich „zugreifen“ auf's CSS, über ein paar definierte Schnittstellen.
Und ja, wenn du die Referenz auf die Schnittstelle style-Objekt eines Elements „verlegst“, dann hast du dir diesen Zugriffsweg verbaut.
Ist ja sonst auch nicht viel anders - window.alert='foo' - danach bekommst du die ursprüngliche alert-Methode auch nicht mehr aufgerufen, wenn du dir nicht vorher irgendwo die Referenz auf sie gesichert hast.
(Wobei sich [element].style normalerweise nicht so einfach überschreiben lässt, zumindest Firefox bringt mir beim Versuch einen Fehler, in etwa “setting something that only has a getter.” Im hier vorliegenden Fall wird es ja nur durch die Existenz eines gleichnamigen Formularelementes überschrieben - das passiert schon „vorher“, bevor deine eigenen Scripte laufen.)
MfG ChrisB
Hi,
heute stehe ich vor einem theoretischen JavaScript-Rätsel, das ich nicht lösen kann. Es geht darum was passiert, wenn man in einem Formular einem Eingabeelement den Namen "style" gibt.
ein ähnliches Problem hast Du etwa bei <input name="action"/>. Plötzlich lässt sich die action-Eigenschaft (also die Repräsentation von <form action="...">) nicht mehr ansprechen. Kurz gesagt ist die JavaScript-Schnittstelle hier etwas ... kurzsichtig erfunden worden. Diverse Implementierungen gewisser Browser tun ihr übriges.
Meine Schlussfolgerung: Vermeide entsprechende Namen.
Das Überschreiben irritiert mich nicht sonderlich, das leuchtet mir ein. Was mir dagegen nicht einleuchtet, das ist die Tatsache, dass sich die Darstellung nicht ändert, sondern dass stattdessen die vorherigen CSS-Deklarationen beibehalten werden. Wenn sie das werden, dann müsste man deren Werte doch irgendwie wieder auslesen und neu beschreiben können, oder nicht? Wenn ja, wie bzw. wo?
Objekte können gewissermaßen im freien Raum schweben, ohne dass Du eine zugreifbare Referenz darauf hast. Der Browser hat intern für seine Rendering Engine eine; das genügt ihm, um das Objekt nicht zu zerstören.
Cheatah
Lieber Cheatah,
Kurz gesagt ist die JavaScript-Schnittstelle hier etwas ... kurzsichtig erfunden worden.
das bestätigt meinen Verdacht.
Meine Schlussfolgerung: Vermeide entsprechende Namen.
Soweit war ich dann auch schon, aber Du bestätigst auch hier mein Ergebnis.
Liebe Grüße,
Felix Riesterer.
Kurz gesagt ist die JavaScript-Schnittstelle hier etwas ... kurzsichtig erfunden worden.
Zu der Zeit, als das erfunden wurde (Client Side Netscape JavaScript 1.0 bzw. 2.0) gab es halt CSS noch nicht, kein style-Attribut, kein DOM, kein CSS-DOM. document.forms war rein zum Zugriff auf das Formular als Formular zuständig. Klar, man hätte antizipieren können, dass es bald ein vollständiges DOM geben wird. Aber bei Netscape schraubte man lieber an »Layern«, bis DOM Level 1 dem etwas später den Garaus machte. Die DOM-Level-0-Schnittstelle zum Formularzugriff blieb aber und war so verbreitet, dass man sie nicht ignorieren konnte. In DOM HTML wurde zumindest formelement.elements.feldName standardisiert, ich glaube in HTML5 jetzt auch formElement.feldName.
Mathias
Hi,
Kurz gesagt ist die JavaScript-Schnittstelle hier etwas ... kurzsichtig erfunden worden.
Zu der Zeit, als das erfunden wurde (Client Side Netscape JavaScript 1.0 bzw. 2.0) gab es halt CSS noch nicht, kein style-Attribut, kein DOM, kein CSS-DOM. document.forms war rein zum Zugriff auf das Formular als Formular zuständig. [...]
richtig, und im Grunde genommen ist das genau das was ich meine - in Verbindung mit dem Umstand, dass das eigentliche Erfinden der Schnittstelle (nämlich der, die heute existiert) später stattfand. document.forms[n][controlName] hätte meiner Ansicht nach in der originalen Form weiter bestehen müssen*; statt dessen wurde es dahingehend erweitert, dass document.forms[n] eine Referenz auf die DOM-Node ist und somit die Controls nicht mehr alleinig gekapselt sind. Dass dieser Mischmasch problematisch ist, muss bekannt gewesen sein.
* Gerne als Abbildung von domFormNode.elements[controlName] oder Vergleichbarem.
Und erwähne in meiner Gegenwart bitte nie wieder <layer>, sonst verdient mein Psychotherapeut zu viel ;-)
Cheatah
Hallo,
Und erwähne in meiner Gegenwart bitte nie wieder <layer>, sonst verdient mein Psychotherapeut zu viel ;-)
aber auch nur so viel, wie du dir aus dem Kreuz layern lässt. ;-)
Ciao,
Martin
Hi,
Und erwähne in meiner Gegenwart bitte nie wieder <layer>, sonst verdient mein Psychotherapeut zu viel ;-)
Für die Sanierung des Gesundheitswesen (und über die Einkommensteuer auch des Staatshaushalts):
<layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer>
cu,
Andreas
Om nah hoo pez nyeetz, MudGuard!
<layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer>
hilft es, wenn ich alle wieder schließe?
</layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer>
oder ist das end-tag optional gewesen?
Matthias
Hi,
<layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer><layer>
</layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer></layer>
</Cheatah> *argl*
Hallo,
Wie war noch gleich der MIME-Type für Wiedergeburten?
Content-Type: alien/resurrection
</Cheatah> *argl*
Ja, man hat's nicht leicht ...
Ciao,
Martin :-))
Om nah hoo pez nyeetz, Der Martin!
</Cheatah> argl
am peinlichsten finde ich aber, dass ich ein h vergessen habe.
Matthias
Hi,
</Cheatah> *argl*
am peinlichsten finde ich aber, dass ich ein h vergessen habe.
es war immerhin das verzeihbarste h.
Cheatah
Hi,
</Cheatah>
Das ist ein "Cheatah Ende Tag" - heißt das, daß Du jetzt ins Bett gehst?
cu,
Andreas
Hi,
</Cheatah>
Das ist ein "Cheatah Ende Tag" - heißt das, daß Du jetzt ins Bett gehst?
Oder er hat sich schon mal eine Grabstein-Inschrift ausgesucht ...
MfG ChrisB
Hi,
</Cheatah>
Das ist ein "Cheatah Ende Tag" - heißt das, daß Du jetzt ins Bett gehst?
nein, das heißt, dass meine Signatur sinnvoll gewählt war. Danke an Martin, ich bin wieder am Leben - mein neuer Teint gefällt mir sehr gut, und solange ich nicht blute, ist auch meine Umgebung kaum gefährdet. Super!
Cheatah
document.forms[n][controlName] hätte meiner Ansicht nach in der originalen Form weiter bestehen müssen*; statt dessen wurde es dahingehend erweitert, dass document.forms[n] eine Referenz auf die DOM-Node ist und somit die Controls nicht mehr alleinig gekapselt sind. Dass dieser Mischmasch problematisch ist, muss bekannt gewesen sein.
Bereits in JavaScript 1.0 konnte man das Formular als solches über document.forms[n] ansprechen. Mit document.forms[i].action ließ sich etwa das action-Attribut auslesen und setzen.
Wenn ein Feld nun »action«, »submit« oder ähnlich benannt war, gab es das Problem der Überlagerung also prinzipiell schon in Javascript 1.0. Wie Netscape 2 das damals handhabte, weiß ich nicht – ich vermute, Felder überlagerten schon damals Formular-Attribute und -Methoden.
Das Problem wurde also nicht mit dem W3C-DOM eingeführt. Dass document.forms[i] den DOM-Knoten liefert, ist durchaus logisch, da document.forms[i] / document.forms.formName bereits das Setzen von Attributen, das Registrieren von Event-Handlern usw. erlaubte. Das HTML-DOM sah zumindest davon ab, formElement.feldName zu standardisieren, und pocht auf die elements-Collection oder Alternativen wie getElementsByName, getElementById.
Mathias