molily: Scripte in HTML-kompatiblem XHTML korrekt maskieren

Beitrag lesen

Variante 1: Du lieferst dein Dokument nicht länger als XHTML aus (blöde Lösung, weil du alles umschreiben musst)
Variante 2: Du deklarierst den Inhalt des Script-Elements als CDATA: <script><![CDATA[ [code lang=javascript]if (foo && bar >= 2) { /* (...) */ } ]]></script>[/code] (wohl die einfachste Methode) oder
Variante 3: Du maskierst tatsächlich die XML-Entries im Script: if (foo [code lang=xml]&amp;&amp; bar &gt;= 2) { /* (...) */ }[/code] (imho unnötig kompliziert und ich weiß auch nicht ob das funktioniert).

Das stimmt alles THEORETISCH, ist aber kontraproduktiv, wenn es um HTML-kompatibles XHTML als text/html geht, also das Dokument nicht (ausschließlich) als XML verarbeitet wird. Und das macht der Fragende auf seiner Site.

Bei Variante 2 muss man die CDATA-Tags unbedingt mit JavaScript-Kommentaren umschließen, wie es auch in http://de.selfhtml.org/html/xhtml/unterschiede.htm#script_style beschrieben ist. Sonst lösen sie einen JavaScript-Fehler aus, wenn sie von einem gewöhnlichen HTML-Parser verarbeitet werden.

<script type="text/javascript">
/* <![CDATA[ */
...
/* ]]> */
</script>

Der OP hat die problematische Lösung eingebaut, daher wird das JavaScript auf http://vickanka.bplaced.net/ gerade nicht ausgeführt - schau mal in die Fehlerkonsole, da steht nur:

syntax error
<![CDATA[ if (foo && bar >= 2) {
vickanka.bplaced.net (Zeile 11)

Variante 3 ist bei XHTML als text/html keine Lösung. Sie stellt zwar den Validator zufrieden und ist gültiges XML, aber das Dokument ist dann nicht mehr als HTML (text/html) verarbeitbar. Der HTML-Parser ersetzt Entity-Referencen innerhalb von <script>...</script> nicht - weil, wie du sagst, der Inhalt als CDATA und nicht als PCDATA verarbeitet wird. Daher sollte man diese Schreibweise vermeiden. Auch sie würde ein JavaScript-Fehler auslösen.

Mathias