17 Stimmen

Soll ich "]]>" oder "//]]>" zum Schließen eines CDATA-Abschnitts in xHTML verwenden?

Ich möchte Skripte oder CSS in XHTML einbinden, ohne Sonderzeichen zu escapen.

Das kann ich mit einem CDATA-gekennzeichneten Abschnitt tun.

Según http://www.w3.org/TR/xhtml1/#h-4.8 kann der CDATA-Abschnitt wie folgt definiert werden:

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

Dann, nach http://www.w3schools.com/TAGS/tag_script.asp kann das CDATA wie folgt aussehen:

   <script type="text/javascript"><![CDATA[
     // some code
   //]]></script>

Welche Methode zum Schließen des CDATA-Abschnitts ist besser? ]]> o //]]> ?

34voto

bobince Punkte 512550

Gemäß www.w3.org/TR/xhtml1/#h-4.8 kann der CDATA-Abschnitt wie folgt definiert werden: [no //]

Ja. In XHTML können sie das. Richtiges XHTML, wie es von einem XML-Parser gelesen wird, wenn Sie application/xhtml+xml zu einem Webbrowser, der nicht IE ist.

Aber wahrscheinlich dienen Sie tatsächlich als text/html was bedeutet, dass Ihr Browser kein "XML-Prozessor" ist, wie in diesem Abschnitt beschrieben. Er ist ein Legacy-HTML4-Parser, d.h. Sie müssen sich an die Anhang C Leitlinien und vermeiden Sie alle XML-Funktionen, die in HTML4 nicht funktionieren.

Insbesondere die Zeichenketten <![CDATA[ et ]]> in einem <script> o <style> Blocks sind für einen HTML4-Parser nichts Besonderes, denn in HTML4 sind diese beiden Elemente 'CDATA-Elemente', für die kein Markup gilt (außer für den </ ETAGO-Sequenz, um das Element selbst zu beenden). Ein HTML4-Parser wird diese Zeichenfolgen also direkt an die CSS- oder JavaScript-Engine senden.

Denn <![CDATA[ kein gültiges JS ist, erhalten Sie einen JavaScript-Syntaxfehler. (Die anderen Antworten sind hier falsch: Es ist nicht nur bei sehr alten Browsern aber alle HTML4-Browser, die bei einem unkommentierten CDATA-Abschnitt im Skript Fehler anzeigen).

Sie verwenden die // o /* Kommentar, um den Inhalt vor der JavaScript- oder CSS-Engine zu verbergen. So:

<script type="text/javascript">//<![CDATA[
    alert('a&b');
//]]></script>

(Beachten Sie die führende // Dies wurde im W3Schools-Beispielcode ausgelassen und führt dazu, dass dieser Beispielcode überhaupt nicht funktioniert. Scheitern. Trauen Sie W3Schools nicht: sie haben nichts mit dem W3C zu tun und ihr Material ist oft Müll).

Dies wird von einem HTML-Parser als gelesen:

  • Open-Tag script Festlegung von CDATA-Inhalten bis zum nächsten ETAGO
  • Text //<![CDATA[\n alert('a&b');\n//]]>
  • ETAGO und close-tag script
  • -> der resultierende Inhalt wird an die JavaScript-Engine gesendet: //<![CDATA[\nalert('a&b');\n//]]>

Sondern durch einen XML-Parser als:

  • Open-Tag script (keine besonderen Auswirkungen auf das Parsing)
  • Inhalt des Textes //
  • Offener CDATA-Abschnitt, der CDATA-Inhalt bis zur nächsten ]]> Reihenfolge
  • Text \n alert('a&b');\n//
  • CDATA-Abschnitt schließen
  • Close-Tag script
  • -> der resultierende Inhalt wird an die JavaScript-Engine gesendet: //\nalert('a&b');\n//

Der Parsing-Prozess ist zwar recht unterschiedlich, aber die JS-Engine endet in jedem Fall mit dem gleichen effektiven Code, da dank der // Der einzige Unterschied besteht in den Kommentaren.

Dies ist ein ganz anderer Fall als bei der alten Schule:

<script type="text/javascript"><!--
    alert('a&b');
//--></script>

die darin bestand, Skript-/Stil-Inhalte auszublenden, damit sie in Browsern, die diese nicht verstehen, nicht auf die Seite geschrieben werden <script> et <style> Tags. Dies führt nicht zu einem JavaScript/CSS-Fehler, da ein Hack auf einer anderen Ebene vorgenommen wurde: Es handelt sich um ein syntaktisches Merkmal der CSS- und JavaScript-Sprachen selbst que <!-- ist so definiert, dass sie nichts tut, so dass dieser Hack funktioniert.

Diese Browser gehören der Vergangenheit an; Sie sind absolut sollten diese Technik nicht anwenden heute. Vor allem in XHTML, denn ein XML-Parser würde Sie beim Wort nehmen und den gesamten Skriptblock in einen XML-Kommentar statt in ausführbaren Code verwandeln.

Ich möchte Skripte oder CSS in xHTML einbinden, ohne Sonderzeichen zu escapen.

Vermeiden Sie dies und Sie werden viel glücklicher sein.

Haben Sie wirklich brauchen die < et & Zeichen in einer <style> ? Nein, fast nie. Brauchen Sie sie wirklich in <script> ? Nun... manchmal, ja, und in diesem Fall ist der kommentierte CDATA-Abschnitt akzeptabel.

Aber um ehrlich zu sein, gilt die XHTML-Kompatibilitätsrichtlinie C.4 für HTML4 genauso wie für XHTML1: alles, was nicht trivial ist, sollte in einem externen Skript enthalten sein, und dann müssen Sie sich um nichts davon kümmern.

3voto

Alan Plum Punkte 10604

Das hängt vom jeweiligen Browser ab. Entgegen dem, was manche Leute denken, ist w3schools nicht mit dem W3C verbunden, so dass ihre Ratschläge mit Vorsicht zu genießen sind.

Moderne Browser sollten in der Lage sein, CDATA-Abschnitte zu erkennen. MSIE hingegen nicht, aber das ist in Ordnung, denn es unterstützt XHTML überhaupt nicht (Sie senden XHTML-Inhalte nicht als text/html, um MSIE-Kompatibilität zu gewährleisten, oder? dann hätte es keinen Sinn, XHTML überhaupt zu verwenden).

Das Problem ist, dass Browser, die XHTML nicht vollständig verstehen, CDATA-Direktiven als normalen Text behandeln.

tl;dr: Die vollständig rückwärtskompatible Lösung wäre etwa so:

<script type="text/javascript"><!--//<![CDATA[
code goes here...
//]]>--></script>

Das ist einfach nur abstoßend. Entweder stecken Sie Ihr JS in JS-Dateien, wenn Sie die Abwärtskompatibilität behalten wollen, oder bleiben Sie bei HTML, bis Sie es sich leisten können, MSIE 8 zu ignorieren (was, wenn man davon ausgeht, wie viele Jahre die Leute gebraucht haben, um MSIE 6 zu meiden, vielleicht um das Jahr 2020 herum sein wird).

Der HTML-Kommentar ( <!-- --> ) ist nur bei Browsern erforderlich, die die Script-Tags nicht verstehen. Die doppelten Schrägstriche sind für Browser erforderlich, die keine CDATA-Abschnitte verstehen (d. h. Nicht-XHTML-Browser wie MSIE). Der CDATA-Abschnitt ist für XHTML erforderlich, um missgebildetes XML zu vermeiden (Größer-als- und Kleiner-als-Vergleiche zum Beispiel würden XML andernfalls zerstören oder erfordern Escaping, was wiederum ein Browserproblem ist).

Weitere Informationen über das Problem beim Senden von XHTML als text/html finden Sie hier: http://hixie.ch/advocacy/xhtml

EDIT: Um mich zu korrigieren, wäre die vollständige Syntax für die Rückwärtsunterstützung laut Hixie eigentlich wie folgt:

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

Danke, Alohci.

1voto

Robusto Punkte 30472

Ich würde es einfach ohne das // machen. Diese sind ein Überbleibsel aus der Zeit, als bestimmte Browser (die ungenannt bleiben sollen) "überlistet" werden mussten, um schließende Klammern in Skript-Tags zu akzeptieren.

0voto

Guffa Punkte 663241

Sie können Kommentare vor die CDATA-Tags setzen, wenn Sie befürchten, dass jemand einen sehr alten Browser benutzt, der sich mit XHTML überhaupt nicht auskennt. Aber dann müssen Sie auch einen Kommentar vor das Start-Tag setzen, um zu verhindern, dass es einen Syntaxfehler verursacht:

<script type="text/javascript">
//<![CDATA[
  // some code
//]]>
</script>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X