Wann ist ein CDATA-Abschnitt innerhalb eines Skript-Tags erforderlich?

907

Sind CDATA- Tags in Skript-Tags jemals erforderlich und wenn ja, wann?

Mit anderen Worten, wann und wo ist das:

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

dem vorzuziehen:

<script type="text/javascript">
...code...
</script>
Brad
quelle
18
Ist dies nicht mehr relevant, da XHTML im Wesentlichen tot ist?
Allyourcode
80
@allyourcode: Warum denkst du, dass XHTML tot ist? HTML5? Es gibt XHTML5, um mitzumachen :)
Doktor J
4
@DoktorJ AFAIK xHTML befand sich in Version 1. Das HTML-Äquivalent war Version 4. In xHTML 2.0 wurden Anstrengungen unternommen, um die Namespaces xform, xlink, time und svg in die Spezifikation zu verschieben, um die gleichen Funktionen von HTML 5 zu verbessern Hinzufügen - xform / Eingabevalidierung, Zeit / Animationen, svg / canvas - aber die Bemühungen für die xHTML 2-Spezifikation wurden auf die HTML 5-Funktionen konzentriert. Das heißt nicht, dass xHTML 2 gelöscht wurde oder veraltet ist, aber es ist in naher Zukunft nicht geplant.
Mihai Stancu
14
XHTML ist in der Entwicklung von Java Seam / JSF / Facelets nicht tot.
JoJo
15
@ Mihai Stancu - das ist nicht ganz richtig. Laut W3C gibt es eine XML-Syntax für HTML5 : "Die andere Syntax, die für HTML5 verwendet werden kann, ist XML. Diese Syntax ist mit XHTML1-Dokumenten und -Implementierungen kompatibel. Dokumente, die diese Syntax verwenden, müssen mit einem XML-Medientyp und Elementen bedient werden in den Namespace w3.org/1999/xhtml gemäß den in den XML-Spezifikationen festgelegten Regeln einzufügen . "
BrainSlugs83

Antworten:

585

Ein CDATA-Abschnitt ist erforderlich, wenn Ihr Dokument als XML analysiert werden soll (z. B. wenn eine XHTML-Seite als XML interpretiert wird) und Sie in der Lage sein möchten, Literal i<10und a && banstelle von i&lt;10und zu schreibena &amp;&amp; b , da XHTML den JavaScript-Code als analysierte Zeichendaten analysiert im Gegensatz zu Zeichendaten standardmäßig. Dies ist kein Problem bei Skripten, die in externen Quelldateien gespeichert sind. Für Inline-JavaScript in XHTML sollten Sie jedoch wahrscheinlich einen CDATA-Abschnitt verwenden.

Beachten Sie, dass viele XHTML-Seiten niemals als XML analysiert werden sollten. In diesem Fall ist dies kein Problem.

Eine gute Beschreibung zu diesem Thema finden Sie unter https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

Michael Ridley
quelle
48
Es steckt viel mehr dahinter als nur "Validierung". Die meisten strengen XML-Parser gehen die Seite nicht durch, wenn sie ein unzulässiges Zeichen treffen. Es geht mehr als nur darum, W3C glücklich zu machen und grün statt rot zu werden.
Loren Segal
40
Wenn Sie vermeiden &und <Zeichen, müssen Sie nicht einen CDATA - Abschnitt; Es wird sowohl in HTML als auch in XHTML gut funktionieren. Sie können dies leicht erreichen, indem Sie den gesamten wichtigen Code in externe Skripte einfügen und nur Inline-Skripte verwenden, um z. Initialisieren Sie Variablen ( bei Bedarf Escape &/ <to \x26/ \x3Cin String-Literalen).
Bobince
23
Was ist mit HTML5?
Mathew Attlee
5
@ Mathew Attle - das ist eine gute Frage. Stellen Sie eine gute Frage in einem separaten Thread, um sicherzustellen, dass er die Aufmerksamkeit erhält, die er benötigt.
Alex KeySmith
3
@Loren: Dann geht es immer noch komplett um Validierung. Das Ausmaß, in dem ein Benutzeragent ungültiges XML ablehnt, ist orthogonal.
Leichtigkeitsrennen im Orbit
231

Wenn Browser das Markup als XML behandeln:

<script>
<![CDATA[
    ...code...
]]>
</script>

Wenn Browser das Markup als HTML behandeln:

<script>
    ...code...
</script>

Wenn Browser das Markup als HTML behandeln und Sie möchten, dass Ihr XHTML 1.0-Markup (zum Beispiel) überprüft wird.

<script>
//<![CDATA[
    ...code...
//]]>
</script>
Shadow2531
quelle
12
Aus Gründen der Codesicherheit ist es besser, Ihre CDATAs mit Blockkommentaren zu umgeben, /* ... */da sonst der Code
unterbrochen
sollte "... als XML" im ersten Abschnitt nicht "... als nicht interpretierter Text" sein? In stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean sehen wir "... diese Zeichenfolgen enthalten Daten, die als XML-Markup interpretiert werden könnten , aber nicht sein sollten."
Matt Wilkie
@mattwilkie, was ich mit "als XML" meine, ist "Wenn Browser ihren XML-Parser (im Gegensatz zum HTML-Parser) verwenden, um das Markup zu analysieren, weil das Dokument mit einem XML-basierten MIME-Typ gesendet wurde oder die Datei, die das Markup enthält eine XML-basierte Dateierweiterung ".
Shadow2531
127

HTML

Ein HTML-Parser behandelt alles zwischen <script>und </script>als Teil des Skripts. Einige Implementierungen benötigen nicht einmal ein korrektes schließendes Tag. Sie stoppen die Skriptinterpretation bei " </", was gemäß den Spezifikationen korrekt ist .

Update In HTML5 und mit aktuellen Browsern ist dies nicht mehr der Fall.

In HTML ist dies also nicht möglich:

<script>
var x = '</script>';
alert(x)
</script>

Ein CDATAAbschnitt hat überhaupt keine Wirkung . Deshalb musst du schreiben

var x = '<' + '/script>'; // or
var x = '<\/script>';

o.ä.

Dies gilt auch für XHTML-Dateien, die als text/html. (Da der IE keine XML-Inhaltstypen unterstützt, ist dies meistens der Fall.)

XML

In XML gelten unterschiedliche Regeln. Beachten Sie, dass (Nicht-IE-) Browser einen XML-Parser nur verwenden, wenn das XHMTL-Dokument mit einem XML-Inhaltstyp bereitgestellt wird.

Für den XML-Parser ist ein scriptTag nicht besser als jedes andere Tag. Insbesondere kann ein Skriptknoten untergeordnete Nicht-Textknoten enthalten, die durch " <" ausgelöst werden . und ein " &" Zeichen bezeichnet eine Zeichenentität.

In XHTML ist dies also nicht möglich:

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>

Um dies zu umgehen, können Sie das gesamte Skript in einen CDATAAbschnitt einschließen. Dies teilt dem Parser mit: 'Behandeln Sie in diesem Abschnitt " <" und " &" nicht als Steuerzeichen .' Um zu verhindern, dass die JavaScript-Engine die Markierungen " <![CDATA[" und " ]]>" interpretiert , können Sie sie in Kommentare einschließen.

Wenn Ihr Skript kein " <" oder " &" enthält, benötigen Sie CDATAohnehin keinen Abschnitt.

user123444555621
quelle
2
Die Aussage "Ein CDATA-Abschnitt hat überhaupt keine Wirkung" gilt nicht für (das vorgeschlagene) HTML5, das das Konstrukt erkennt. w3.org/TR/html5/syntax.html#cdata-sections
danorton
3
@ Danorton Interessant. Ich denke, das ist eine ziemlich hässliche Mischung. Immer noch keine Auswirkung auf den Skriptinhalt.
user123444555621
2
Wusste nicht, dass irgendwelche </ Inside-Script-Tags schlecht sind.
Salman A
3
@SalmanA Das ist eine der Kuriositäten von HTML und heißt offiziell ETAGO . Weitere Informationen : mathiasbynens.be/notes/etago (während der Artikel besagt, dass kein Browser diese Funktion jemals implementiert hat, bin ich mir ziemlich sicher, dass es mir Probleme bereitet hat. Vielleicht in einem anderen Tool)
user123444555621
1
Eigentlich bin ich auf Validierungsprobleme gestoßen - kann <script>var b = "<b>bold</b>";</script>nicht validiert werden, aber nachdem ich Ihre Antwort gelesen und geändert habe, um <script>var b = "<b>bold<\/b>";</script>sie zu beheben .
Salman A
30

Grundsätzlich ist es möglich, ein Dokument zu schreiben, das sowohl XHTML als auch HTML ist. Das Problem ist, dass der XML-Parser in XHTML die Zeichen &, <,> im Skript- Tag interpretiert und einen XML-Analysefehler verursacht. Sie können Ihr JavaScript also mit Entitäten schreiben, z.

if (a &gt; b) alert('hello world');

Das ist aber unpraktisch. Das größere Problem ist, dass beim Lesen der Seite in HTML das Tag- Skript standardmäßig als CDATA betrachtet wird und ein solches JavaScript nicht ausgeführt wird. Wenn Sie möchten, dass dieselbe Seite sowohl mit XHTML- als auch mit HTML-Parsern in Ordnung ist, müssen Sie das Skript- Tag in das CDATA-Element in XHTML einschließen, NICHT jedoch in HTML.

Dieser Trick markiert den Beginn eines CDATA-Elements als JavaScript-Kommentar. In HTML ignoriert der JavaScript-Parser das CDATA-Tag (es ist ein Kommentar). In XHTML erkennt der XML-Parser (der vor dem JavaScript ausgeführt wird) dies und behandelt den Rest bis zum Ende von CDATA als CDATA.

ondra
quelle
24

Es ist eine X (HT) ML-Sache. Wenn Sie Symbole wie <und >innerhalb von JavaScript verwenden, z. B. zum Vergleichen von zwei Ganzzahlen, muss dies wie XML analysiert werden, sodass sie als Anfang oder Ende eines Tags markiert werden.

Die CDATA bedeutet, dass die folgenden Zeilen (alles bis zum ]]>ist nicht XML und sollten daher nicht auf diese Weise analysiert werden.

Franz
quelle
18

Sie nicht verwenden CDATA in HTML4 , aber Sie sollten CDATA in XHTML verwenden und müssen CDATA in XML verwenden , wenn Sie unescaped Symbole wie <und> haben.

Loren Segal
quelle
11
CDATA ist in HTML4 nicht gültig. Einfach gesagt, es ist nicht Teil der Grammatik. CDATA ist eine Syntax von XML und XHTML ist eine XML-Teilmenge. Daher sollte es nur in XML (und seinen Teilmengen) verwendet werden. HTML hingegen ist kein XML.
Loren Segal
17

Damit wird sichergestellt, dass die XHTML-Validierung ordnungsgemäß funktioniert, wenn JavaScript in Ihre Seite eingebettet ist und nicht extern referenziert wird.

Für XHTML muss Ihre Seite den XML-Markup-Anforderungen genau entsprechen. Da JavaScript möglicherweise Zeichen mit besonderer Bedeutung enthält, müssen Sie es in CDATA einschließen, um sicherzustellen, dass die Validierung es nicht als fehlerhaft kennzeichnet.

Bei HTML-Seiten im Web können Sie nur das erforderliche JavaScript zwischen und Tags einfügen. Wenn Sie den HTML-Code auf Ihrer Webseite validieren, wird der JavaScript-Inhalt als CDATA (Zeichendaten) betrachtet, der daher vom Validator ignoriert wird. Das Gleiche gilt nicht, wenn Sie beim Einrichten Ihrer Webseite die neueren XHTML-Standards befolgen. Bei XHTML wird der Code zwischen den Skript-Tags als PCDATA (analysierte Zeichendaten) betrachtet, der daher vom Validator verarbeitet wird.

Aus diesem Grund können Sie JavaScript nicht einfach zwischen die Skript-Tags auf Ihrer Seite einfügen, ohne Ihre Webseite zu "beschädigen" (zumindest was den Validator betrifft).

Sie können lernen , hier mehr über CDATA und mehr über XHTML hier .

LBushkin
quelle
10

CDATA gibt an, dass der Inhalt nicht XML ist.

Hier ist eine Erklärung auf Wikipedia

Alex Beardsley
quelle
9

Wenn Sie eine strikte XHTML-Konformität anstreben, benötigen Sie die CDATA, sodass weniger als und kaufmännisches Und nicht als ungültige Zeichen gekennzeichnet sind.

Chris Shaffer
quelle
8

um XML-Fehler während der XML-Validierung zu vermeiden.

gehsekky
quelle
8

CDATA weist den Browser an, den Text unverändert anzuzeigen und nicht als HTML zu rendern.

Ikaso
quelle
6

CDATA gibt an, dass der Inhalt nicht XML ist.

Jim
quelle
2

Auf diese Weise analysieren ältere Browser den Javascript-Code nicht und die Seite wird nicht beschädigt.

Abwärtskompatibilität. Ich muss es lieben.

Tyler Carter
quelle