JavaScript Entities vs. HTML-Konformitaet
Stefan Muenz
- javascript
Liebe Forumer,
es gibt da eine von Netscape 3.x eingefuehrte Technik in JavaScript, die weithin unbekannt geblieben ist - die sogenannten "JavaScript-Entities". Beispiel:
<script>
var Zufallsbreite = Math.round(Math.random()*400);
</script>
<hr width="&{Zufallsbreite};">
Ueber Sinn und Unsinn dieser Technik im DOM-Zeitalter, die ausserdem in keinem modernen Browser funktioniert, moechte ich jetzt nicht weiter diskutieren. Was ich fragen moechte ist eher: wie steht es dabei mit der Konfliktaustragung mit dem HTML-Parser? Dieser erwartet ja nun beim width-Attribut eine Pixel- oder Prozent-Angabe, aber keinen String, der mit einem "&{...." beginnt. Korrekt waere die Sache allenfalls, wenn der JavaScript-Interpreter ein vorgeparstes Dokument an den HTML-Parser uebergibt (also fast ein bissschen PHP-maessig), wo dann ein aus Sicht des HTML-Parsers korrekter Wert beim width-Attribut eingetragen ist.
Der folgende Test ergab, dass bei Verwendung von HTML 4.01 Strict der W3-Validator tatsaechlich zufrieden ist:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head><body>
<script type="text/javascript">
var Border = 1;
</script>
<table border="&{Border};"><tr><td> </td></tr></table>
</body></html>
Obwohl der Parser des Validators bei border= eine Pixelangabe erwartet, frisst er die Angabe "&{Border};". Frage nun: wertet der HTML-Parser einfach nur die Wertzuweisung nicht genau genug aus? Und sind JavaScript-Entities, in dieser Form verwendet, tatsaechlich HTML-konform?
viele Gruesse
Stefan Muenz
Moin Moin !
es gibt da eine von Netscape 3.x eingefuehrte Technik in JavaScript, die weithin unbekannt geblieben ist - die sogenannten "JavaScript-Entities". Beispiel:
Jippie! Es gibt außer mir noch jemanden, der das Netscape-Dokument gelesen hat. ;-)
Der folgende Test ergab, dass bei Verwendung von HTML 4.01 Strict der W3-Validator tatsaechlich zufrieden ist:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head><body>
<script type="text/javascript">
var Border = 1;
</script>
<table border="&{Border};"><tr><td> </td></tr></table>
</body></html>
Es ist auch ohne den Script-Teil valides HTML. Wie ist denn der Wert für das Border-Attribut (und die anderen Attribute) definiert? Steht in der HTML-4.01-Spec sowas wie "&{...}; ist als Zahl zu werten"? Oder darf als Wert für Border einfach so ziemlich jeder Dreck stehen? Wohl letzteres, denn "<table border="larifariblafasel">" ist auch valides HTML - laut W3C-Validator.
Alexander
Hi,
es gibt da eine von Netscape 3.x eingefuehrte Technik
Proprietäres Zeug ist immer schlecht...
Was ich fragen moechte ist eher: wie steht es dabei mit der Konfliktaustragung mit dem HTML-Parser? Dieser erwartet ja nun beim width-Attribut eine Pixel- oder Prozent-Angabe, aber keinen String, der mit einem "&{...." beginnt.
Nein. Siehe unten.
Der folgende Test ergab, dass bei Verwendung von HTML 4.01 Strict der W3-Validator tatsaechlich zufrieden ist:
Obwohl der Parser des Validators bei border= eine Pixelangabe erwartet, frisst er die Angabe "&{Border};".
Das border-Attribut hat als Datentyp %Pixel;
siehe
<!ATTLIST TABLE -- table element --
[... gekürzt...]
border %Pixels; #IMPLIED -- controls frame width around table --
[... gekürzt...]
>
Dieses %Pixels; ist definiert als
<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
Der HTML-Parser erwartet hier also Zeichendaten.
Daß es sich dabei um eine Zahl handelt, steht nur im Kommentar (dieser kann und darf von einem DTD-basierten Validator nicht ausgewertet werden)
Die Frage ist nur, in wie weit die unbekannte Entity gegen die SGML-Regeln verstößt - scheinbar tut es das nicht - kann ich aber nicht genau sagen. (SGML ist eine ISO-Norm, und die gibt es nur gegen viel Geld...)
Frage nun: wertet der HTML-Parser einfach nur die Wertzuweisung nicht genau genug aus?
Der HTML-Parser des Validators KANN das NICHT genauer. s.o.
Und sind JavaScript-Entities, in dieser Form verwendet, tatsaechlich HTML-konform?
Das ist m.E. genauso konform wie border="abc"
viele Gruesse
Stefan Muenz
cu,
Andreas
Hallo Andreas,
Dieses %Pixels; ist definiert als
<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
Die Frage ist nur, in wie weit die unbekannte Entity gegen die SGML-Regeln verstößt - scheinbar tut es das nicht -
Im CDATA gibt es keine Entities. Nur Zeichen. Dehalb ist z.B. auch folgendes valid HTML´:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title></title>
</head>
<body>
<hr width="<abcd='efeg'>">
</body>
</html>
Grüße
Thomas
Hi,
Im CDATA gibt es keine Entities. Nur Zeichen. Dehalb ist z.B. auch folgendes valid HTML´:
Glaub ich nicht:
<!ATTLIST A
[...]
href %URI; #IMPLIED -- URI for linked resource --
[...]
>
<!ENTITY % URI "CDATA"
-- a Uniform Resource Identifier,
see [URI]
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title></title>
</head>
<body>
<hr width="<abcd='efeg'>">
<a href="http://forum.de.selfhtml.org/my/?t=39675&m=217584">Validier mich</a>
</body>
</html>
Validier das mal.
cu,
Andreas
Hallo,
Glaub ich nicht:
Validier das mal.
Ja, du hast recht.
Grüße
Thomas
Hi!
Der Parser sollte bei Border Daten vom Typ %Pixels erwarten http://www.w3.org/TR/html4/sgml/dtd.html#Pixels. Das Entity %Pixels enthält aber CDATA http://www.w3.org/TR/html4/types.html#type-cdata und nicht NUMBER als Datentyp.
Das einzige was mir komisch vorkommt, ist die Art der Entitydefinition &{bla}; welche zwar anscheinend nicht verboten ist, worüber ich jetzt allerdings auch noch nicht's gefunden habe. Villeicht steht etwas in der SGML-Norm drin.
Gruß Herbalizer
Auch Hi!
Das einzige was mir komisch vorkommt, ist die Art der Entitydefinition &{bla}; welche zwar anscheinend nicht verboten ist, worüber ich jetzt allerdings auch noch nicht's gefunden habe. Villeicht steht etwas in der SGML-Norm drin.
Um das mal noch etwas deutlicher zu sagen: Eine Entity-Reference ist an der Stelle auf jeden Fall erlaubt. Gaebe es in der HTML-DTD eine Zeile
<!ENTITY width400 "400">
koennte man z.B. schreiben
<hr width="&width400;">
und der HTML-Parser muesste das zu <hr width="400"> aufloesen, was dann als 400 Pixel interpretiert wird. In XHTML koennte man die Entity selber im XML-Prolog definieren.
Die Frage, die die Validitaet entscheidet, ist also, ob &{...}; als korrekte Entity Reference durch geht. Anscheinend schon, wenn der Validator nicht meckert. Gleichzeitig muss ihm aber klar sein, dass er nicht versuchen soll, dies wie andere Entity References aufzuloesen (er stellt ja normalerweise zumindest fest, wenn es z.B. &xyz; nicht gibt (kennt man von URLs mit unmaskierten Ampersands)).
So long
Hallo Calo,
Um das mal noch etwas deutlicher zu sagen: Eine Entity-Reference ist an der Stelle auf jeden Fall erlaubt.
Jein, "erlaubt" ist es weil es keine Rolle spielt.
Gaebe es in der HTML-DTD eine Zeile
<!ENTITY width400 "400">
koennte man z.B. schreiben
<hr width="&width400;">
und der HTML-Parser muesste das zu <hr width="400"> aufloesen,
Nur dann wenn das Attribut "width" nicht als CDATA definiert wäre.
Grüße
Thomas
Hi!
Um das mal noch etwas deutlicher zu sagen: Eine Entity-Reference ist an der Stelle auf jeden Fall erlaubt.
Jein, "erlaubt" ist es weil es keine Rolle spielt.
Nein, erlaubt ist es weil es CDATA so definiert, bzw. weil ein Character entity aus einer Zeichenkette besteht. CDATA beinhaltet alle Zeichen und Zeichenketten ausser <, &, ]]> und --, welche durch Character entitys dargestellt werden müssen.
<hr width="&width400;">
und der HTML-Parser muesste das zu <hr width="400"> aufloesen,
Nur dann wenn das Attribut "width" nicht als CDATA definiert wäre.
In http://www.w3.org/TR/html4/types.html#h-6.2 steht explizit, das character entitys aufgelöst werden sollten. In diesem Fall muß &width400; in 400 aufegelöst werden. Wäre width nicht %Length und %Length nicht vom Datentyp CDATA sondern NUMBER, ID oder NAME, sind Character entitys (möglicherweise?) nicht erlaubt!
Grüße
Thomas
Gruß Herbalizer
Hallo,
In http://www.w3.org/TR/html4/types.html#h-6.2 steht explizit, das character entitys aufgelöst werden sollten.
Du hast natürlich recht. Ich werde wohl alt ;-)
Grüße
Thomas
Moin Moin !
Der Parser sollte bei Border Daten vom Typ %Pixels erwarten http://www.w3.org/TR/html4/sgml/dtd.html#Pixels. Das Entity %Pixels enthält aber CDATA http://www.w3.org/TR/html4/types.html#type-cdata und nicht NUMBER als Datentyp.
Ist das vielleicht Absicht, damit <table border> oder <table border="border"> funktionieren? Ok, das ist "Street HTML" und hat im Standard IMHO nichts verloren, aber Standards werden nun einmal von Menschen gemacht.
Alexander
Liebe Forumer,
es gibt da eine von Netscape 3.x eingefuehrte Technik in JavaScript, die weithin unbekannt geblieben ist - die sogenannten "JavaScript-Entities". Beispiel:
<script>
var Zufallsbreite = Math.round(Math.random()*400);
</script>
<hr width="&{Zufallsbreite};">Ueber Sinn und Unsinn dieser Technik im DOM-Zeitalter,
Die Auflösung: http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 ;-)
Grüße
Thomas
Hallo Thomas,
Die Auflösung: http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 ;-)
Hab ichs doch geahnt, dass die allwissende Spec keine offenen Fragen zulaesst ;-)
Was mich als willfaehriger Text-Exegete an dem Abschnitt B.7.1 nur stirnrunzeln macht, ist die Tatsache, dass die ganze Syntax einerseits als Zukunftsmusik ausgewiesen wird, dann aber die konkreten Beispiele als "deprecated example" erklaert werden. Das gleiche Phaenomen ist mir schon mal an einer anderen Stelle der HTML-Spec begegnet, und da konnte ich es mir auch nicht erklaeren. Aber vielleicht verstehts ja sonst jemand hier ;-)
Danke auch an die anderen im Thread fuer die Antworten!
viele Gruesse
Stefan Muenz