LaurentDenis
mercredi 26 janvier 2005 à 13:06
Du danger des simplifications... Ce que dit le
HTML 4.0 Block-Level Elements du WDG est un beau racourci... qui crée effectivement une certaine confusion.
<script> n'est pas alternativement un élément %inline et un élément %bloc. C'est un élément %inline uniquement.
En effet, la DTD HTML4.01 stricte déclare:
CODE
<!-- %inline; covers inline or "text-level" elements -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
Où est <script> là-dedans ? Tout simplement dans %special :
CODE
<!ENTITY % special
"A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
En d'autres termes, <script> appartient à la catégorie %special, laquelle appartient elle-même à la catégorie %inline.
En revanche, <script> n'est pas un élément %block :
CODE
<!ENTITY % block
"P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
... là, pas de SCRIPT directement ou indirectement mentionné. (En revanche, on y trouve bien <noscript>)
Alors... Comment fait <script> pour pouvoir se mettre directement dans <head> et dans <body>, qui n'admettent pas d'éléments enfants %inline ? Tout simplement en vertu d'un cas d'exception :
CODE
<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
Autrement dit, <script> bénéficie ici d'un privilège qui l'autorise à figurer dans <body> et dans <head>.
En HTML4.01 transitional, il en est de même, si ce n'est que <script> peut être mis directement dans <body> puisque l'une des particularités de transitional est d'y autoriser la présence d'un élément %inline. En revanche, on trouve la même règle d'exception pour <head>
On est donc dans un cas très différents de <ins> et <del> qui eux, sont explicitement des éléments alternativement %inline et %block, selon les DTD.
Maintenant, le problème reste entier : un <script> étant %inline... peut-il comporter des éléments %block ? Là, le WDG simplifie maladroitement : en effet, un <script>
ne contient aucun élément HTML. La question ne se pose simplement pas.
En revanche, il peut
générer un élément HTML %block... qui n'invalidera pas le document, mais qui n'en sera pas moins problématique.
C'est une des limites du HTML. XHTML résoud le problème, par exemple en faisant en sorte que document.write ne marche pas dans un script lorsque XHTML est traité comme du XML...
Dans le même ordre d'idées, <script> peut permettre de générer la balise de fermeture d'un élément ouvert hors du script. Si javascript est désactivé... l'élément n'est plus fermé

Là encore, ce n'est plus possible en "vrai" XHTML.
Et puis, au fond, on le sait :
javascript est intrinsèquement démoniaque