</script>
muss aufgelöst werden, da sonst der umschließende <script></script>
Block zu früh beendet würde. Eigentlich sollte es zwischen dem <
und dem aufgeteilt werden /
, da ein Skriptblock</
(laut SGML) durch eine beliebige ETAGO-Sequenz (End-Tag Open) (dh ) beendet werden soll :
Obwohl die STYLE- und SCRIPT-Elemente CDATA für ihr Datenmodell verwenden, muss CDATA für diese Elemente von Benutzeragenten unterschiedlich behandelt werden. Markups und Entitäten müssen als Rohtext behandelt und unverändert an die Anwendung übergeben werden. Das erste Auftreten der Zeichenfolge " </
" (End-Tag Open Trennzeichen) wird als Abschluss des Endes des Elementinhalts behandelt. In gültigen Dokumenten wäre dies das End-Tag für das Element.
In der Praxis beenden Browser jedoch nur das Parsen eines CDATA-Skriptblocks auf einem tatsächlichen </script>
Close-Tag.
In XHTML gibt es keine solche spezielle Behandlung für Skriptblöcke, daher muss jedes <
(oder &
) Zeichen in ihnen &escaped;
wie in jedem anderen Element sein. Dann werden Browser, die XHTML als HTML der alten Schule analysieren, verwirrt. Es gibt Problemumgehungen für CDATA-Blöcke, aber es ist am einfachsten, die Verwendung dieser Zeichen ohne Flucht zu vermeiden. Eine bessere Möglichkeit, ein Skriptelement aus einem Skript zu schreiben, das für beide Parsertypen geeignet ist, ist:
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>
\/
ist eine gültige Escape-Sequenz für/
, warum also nicht einfach diese anstelle dieser String-Literal- Escape- Zeichen verwenden<
? ZBdocument.write('<script src=foo.js><\/script>');
. Dies</script>
ist auch nicht die einzige Zeichenfolge, die ein<script>
Element schließen kann. Einige weitere Informationen hier: mathiasbynens.be/notes/etago<\/script>
ist in diesem Fall in Ordnung, würde aber nur in HTML funktionieren; In XHTML ohne zusätzliche CDATA-Abschnittsumhüllung handelt es sich immer noch um einen wohlgeformten Fehler. Sie können auch\x3C
Inline-Event-Handler-Attribute verwenden,<
die sowohl in HTML als auch in XHTML ungültig sind, sodass sie eine breitere Anwendbarkeit haben: Wenn ich eine einfach zu automatisierende Methode gewählt hätte, um vertrauliche Zeichen in JS-Zeichenfolgenliteralen für alle Kontexte zu umgehen, ist dies der Fall die, für die ich mich entscheiden würde.<
Kann in HTML in Inline-Ereignishandlerattributen verwendet werden. html5.validator.nu/… Und Sie haben Recht mit der XHTML-Kompatibilität von\x3C
sich selbst, aber da XHTMLdocument.write
(oderinnerHTML
) sowieso nicht unterstützt, sehe ich nicht, wie relevant das ist.document.write
ist irrelevant, es ist nur das Beispiel. Das OP hätte innerHTML verwenden können. Es geht darum, die</
Zeichenfolge vor dem Markup-Parser zu verstecken , wo immer sie auftritt. Es ist nur so, dass die meisten Parser es innerhalb eines Skriptelements tolerieren, wenn sie es strikt nicht sollten (aber HTML-Parser sind sehr tolerant). Sie haben Recht, aber das<\/
reicht in allen Fällen für HTML aus.document.write('<script src="foo.js">\x3C/script>')
scheint in allen Browsern ausreichend zu sein, zurück zum IE6 zu gelangen. (Ich habe das Typattribut weggelassen, weil es in HTML5 nicht erforderlich ist und von keinem Browser wie erforderlich erzwungen wird.)Hier ist eine weitere Variante, die ich verwendet habe, um ein Skript-Tag inline zu generieren (damit es sofort ausgeführt wird), ohne dass Escapezeichen erforderlich sind:
(Hinweis: Im Gegensatz zu den meisten Beispielen im Internet setze ich
type="text/javascript"
weder das einschließende noch das generierte Tag ein: Es gibt keinen Browser, der dies nicht als Standard hat, und daher ist es redundant, wird aber auch nicht schaden. wenn Sie nicht einverstanden sind).quelle
Ich denke, dies soll verhindern, dass der HTML-Parser des Browsers das <script> und hauptsächlich das </ script> als schließendes Tag des eigentlichen Skripts interpretiert. Ich denke jedoch nicht, dass die Verwendung von document.write eine hervorragende Idee für die Bewertung von Skripten ist Blöcke, warum nicht das DOM verwenden ...
quelle
Die von Bobince veröffentlichte Lösung funktioniert perfekt für mich. Ich wollte auch zukünftigen Besuchern eine alternative Methode anbieten:
In diesem Beispiel habe ich eine bedingte Last für jQuery eingefügt, um den Anwendungsfall zu demonstrieren. Hoffe das ist nützlich für jemanden!
quelle
Das
</script>
Innere des Javascript-String-Wurfs wird vom HTML-Parser als schließendes Tag interpretiert, was zu unerwartetem Verhalten führt ( siehe Beispiel zu JSFiddle) ).Um dies zu vermeiden, können Sie Ihr Javascript zwischen Kommentaren platzieren (diese Art der Codierung war gängige Praxis, als Javascript in Browsern nur unzureichend unterstützt wurde). Dies würde funktionieren ( siehe Beispiel in JSFiddle ):
... aber um ehrlich zu sein,
document.write
würde ich die Verwendung nicht als Best Practice betrachten. Warum nicht das DOM direkt manipulieren?quelle
append
statt geschriebenappendChild
. Die Antwort wurde korrigiert. Danke, dass du es bemerkst!