2017-10-17 1 views
0

fin d'une balise de script dans JSON provoquant une erreur d'analyseur de chrome

var c= {"Content":"</SCRIPT>"}

donne erreur d'analyse dans Chrome. œuvres Échapper ... </SCRIPT>

https://jsfiddle.net/OndrejSpilka327/banr9836/

Est-il vraiment bug chrome?

EDIT Je ne pense pas que l'argumentation soit correcte. L'analyseur HTML ne devrait rien avoir à faire avec l'analyseur syntaxique JavaScript. Tout d'abord, tout ce qui est inclus dans doit être analysé comme JavaScript, pas HTML. C'est certainement une mauvaise implémentation de l'analyseur HTML.

Pour votre curiosité:

var c= {"Content":"<SCRIPT></SCRIPT>"} 
 
console.log(c.Content);

produit l'erreur sam dans jsFiddle ... et cela est certainement bien formé. Encore une fois, on peut affirmer que SCRIPT ne peut pas apparaître à l'intérieur de la balise SCRIPT externe, cependant tout ce qui est inclus dans les balises SCRIPT doit être analysé comme un script non HTML et surtout s'il s'échappe dans un littéral de chaîne normal. Une telle argumentation préconise seulement une mauvaise implémentation.

De toute évidence, le comportement génère des erreurs lorsque vous travaillez avec du contenu personnalisé sérialisé à json et persistant dans le tag SCRIPT.

Juste curieux quels tags vous avez enlevé Felix et pourquoi?

+0

Un littéral d'objet est différent de JSON. Vous n'avez pas JSON ici. –

+0

Eh bien, cet objet littéral est compatible avec JSON. Mais pour être précis, oui, c'est un objet littéral. Ça ne fait aucune différence. – OSP

+1

"Tout d'abord, tout ce qui est inclus dans" "devrait être analysé en JavaScript, pas en HTML, ce qui est certainement une mauvaise implémentation de l'analyseur HTML." - Non. Le JavaScript est ** dans ** le HTML. Vous devez soit analyser le HTML (voici la balise de début, voici un nœud de texte, voici la balise de fin, passez maintenant le nœud de texte à l'analyseur JS pour être traité comme JS) ou vous devez reconnaître la balise de début et passez ensuite à l'analyse JS jusqu'à ce que vous atteigniez la fin du JS qui n'a aucun moyen de marquer "la fin du JS", ce qui est impossible et HTML + JS ne sont donc pas conçus pour être analysés comme ça. – Quentin

Répondre

2

Non ce n'est pas un bug Chrome. L'analyseur HTML ne sait rien sur JavaScript, il ferme la balise <script> à la première occurrence de </script> qu'il trouve. Si c'est au milieu d'un programme JavaScript, vous vous retrouvez avec un programme invalide.

Toute séquence de caractères ayant une signification particulière mais ne devant pas être interprétée avec cette signification particulière doit être échappée ou divisée.

Voir aussi Why split the <script> tag when writing it with document.write()?

+0

Eh bien, je ne pense pas que votre explication soit correcte. Tout d'abord, tout ce qui est inclus dans devrait être analysé comme JavaScript, pas HTML. C'est certainement une mauvaise implémentation. Deuxièmement, ce code produit la même erreur: – OSP

+0

* "tout ce qui est inclus dans devrait être analysé comme JavaScript, pas HTML" * Ce n'est pas un travail de parseurs HTML pour analyser JavaScript. Pour obtenir le code JavaScript, le document HTML doit d'abord être analysé. C'est le travail des parseurs HTML. Il transmet ensuite le contenu de la balise '