2017-10-17 57 views
0

结束脚本标签造成铬解析错误

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

给出了Chrome的解析错误。 逃离作品... </SCRIPT>

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

是否真的铬错误吗?

编辑 我不认为论证是正确的。 HTML解析器应该与JavaScript解析器无关。 首先,任何内容都应该被解析为JavaScript,而不是HTML。这绝对是HTML解析器的错误实现。

对于你的好奇心:

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

主要生产中的jsfiddle的SAM错误...这绝对是很好形成。

再一次可以争辩说SCRIPT标签不能出现在外部SCRIPT标签内,然而无论在SCRIPT标签中包含什么,都应该将其解析为不是HTML的脚本,特别是如果在常规字符串文字中转义。

这样的论证只提倡糟糕的实现。

很明显,在使用序列化为json的自定义内容并保存在SCRIPT标记中时,该行为会产生错误。

只是好奇你删除了菲利克斯的标签,为什么?

+0

对象文字与JSON不一样。这里没有JSON。 –

+0

那么这个对象字面值是JSON兼容的。但是,确切地说,是的,这是对象字面。没有区别。 – OSP

+1

“首先,无论是否包含在''中,都应该被解析为JavaScript,而不是HTML。这是HTML解析器的绝对错误实现。” - 不是。在HTML里面的JavaScript是**。您需要解析HTML(这里是开始标记,这里是一个文本节点,这里是结束标记,现在将文本节点传递给JS解析器以作为JS处理),或者您需要识别开始标记和然后切换到解析JS,直到到达无法标记“JS的结尾”的JS的末尾,因此这是不可能的,因此HTML + JS不会被设计为像那样被解析。 – Quentin

回答

2

不,这不是Chrome的bug。 HTML解析器不知道JavaScript的任何内容,它会在它发现的</script>的第一个匹配项上关闭<script>标签。如果这是JavaScript程序的中间,那么最终会生成一个无效的程序。

任何具有特殊含义但不应解释为特殊含义的字符序列都需要被转义或拆分。

另请参见Why split the <script> tag when writing it with document.write()?

+0

嗯,我不认为你的解释是正确的。 首先,不管是否包含在应该被解析为JavaScript,而不是HTML。这绝对是错误的实现。 其次,此代码产生相同的错误: – OSP

+0

*“应该被解析为JavaScript,而不是HTML”*它不是解析JavaScript的HTML解析器作业。为了获得JavaScript代码,必须先解析HTML文档。这是HTML解析器的工作。然后它将'