molily: Problematische Kurzschreibweise zum Schließen von Elementen?

Beitrag lesen

Hallo,

Auffällig ist in diesem Zusammenhang auch Firefox’ eigene Quelltextansicht; hier ist aus irgendeinem Grund das Syntaxhighlighting nach dem ersten script-Element fehlerhaft, als wäre dieses Element nie geschlossen worden.

<tag /> wird von Geckos Tag-Soup-Parser als bloßer Start-Tag behandelt. Das »/« wird einfach als irgendwelcher unidentifizierbarer Müll im Tag angesehen.

Beispiel:

<body>
<div />
<div />
</body>

wird behandelt wie

<body>
<div>
<div>
</body>

Das wird dank der Fehlerkorrektur zu

<body>
<div>
<div>
</div></div>
</body>

Und der DOM-Baum ist entsprechend

body
  \ div
      \ div

und nicht etwa

body
  \ div
  \ div

Wenn du nun schreibst:

<script type="text/javascript" src="foo.js" />
alert("inline");
</script>

wird das ganze im Gecko so behandelt

<script type="text/javascript" src="foo.js">
alert("inline");
</script>

und das wird zu

<script type="text/javascript" src="foo.js"></script>

weil Code in script ignoriert wird, wenn ein src-Attribut vorhanden ist.

Bekanntlich kann durch eine Sonderregelung im HTML-4-Standard in script jeglicher Code auftauchen, erst bei »</« wird das Element beendet. Aus HTML-Sicht ist es also möglich, in script alle möglichen Start-Tags unterzubringen, ohne dass sie vom Parser als solche beachtet werden.

<script type="text/javascript" src="1.js">
<script type="text/javascript" src="2.js">
<script type="text/javascript" src="3.js">
</script>

ist aus HTML-Sicht ein Script-Element mit dem Textinhalt »<script type="text/javascript" src="2.js"><script type="text/javascript" src="3.js">«. Das ist wegen dem src-Attribut äquivalent zu

<script type="text/javascript" src="1.js"></script>

So erklärt sich das Verhalten. Ist doch ganz logisch. ;) Man muss sich bloß davor hüten, anzunehmen, XHTML-als-text/html würde in irgendeiner Weise nach festgelegten Regeln verarbeitet. Nein, der Browser rät gänzlich ohne Beachtung des Doctypes herum.

Mathias