Chrome中非常奇怪的故障 - 解析字符串的内容!

时间:2010-04-23 06:15:31

标签: javascript html google-chrome html-parsing

好的 - 这是我一段时间看到的最愚蠢的故障:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>

var data = "</script>";

</script>
</head>
<body>

This should break!

</body>
</html>

这会导致语法错误,因为JavaScript解析器实际上是在读取字符串的内容。多么愚蠢!

如何将</script>放入我的代码中。有什么办法吗?

这种行为是否有正当理由?

4 个答案:

答案 0 :(得分:5)

在X(HT)ML(当actually treated as such时)内,由于这个原因,脚本需要作为CDATA进行转义。 http://www.w3.org/TR/xhtml1/diffs.html#h-4.8

  

在XHTML中,脚本和样式元素被声明为具有#PCDATA内容。因此,<&将被视为标记的开头,而&lt;&amp;等实体将被XML处理器识别为实体引用分别为<&。在CDATA标记的部分中包装脚本或样式元素的内容可以避免扩展这些实体。

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

如果您的XHTML文档仅作为text / html提供并被视为标记汤,则不适用,您只需要“转义”字符串'</scr' + 'ipt>'

答案 1 :(得分:2)

这不是一个小问题 - 这是正常的预期行为,如果你想一想,这是非常正确的。 HTML规范没有定义脚本语言,因此所有引擎都应该看到</script>之前的纯文本,这会关闭标记。除了已经概述的选项之外,还有几个选项:

// escape the / character, changing the format of the "closing" tag
var data = "<\/script>"; 

// break up the string
var data = "</"+"script>";

第一种方法有效,因为HTML不使用\进行转义,它被视为文字字符,当然<\/script>不是有效的结束标记。第二个原因是有更明显的原因,但我被其他人告知我不应该使用它(我从来都不明白为什么)。

答案 2 :(得分:0)

这样写:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>
<!--
var data = "</script>";
-->
</script>
</head>
<body>
This should break!
</body>
</html>

原因很简单,在执行javascript之前解析HTML,<!---->使解析器忽略此部分中出现的所有标记。

答案 3 :(得分:0)

如果您能相信the HTML4 standard,那么脚本内容

  

以第一个ETAGO(“&lt; /”)分隔符结尾,后跟名称起始字符([a-zA-Z])

因此,JavaScript解析器不会像您描述的那样读取字符串的内容;在var data = "之后,JavaScript解析器永远不会得到任何东西,这显然不是一个有效的脚本。

避免意外结束JavaScript的最简单方法是使用Andy E的第一个建议:

var data = "<\/script>"; 

这样,HTML解析器看不到</,因此脚本内容不会结束,\/相当于JavaScript字符串文字中的/,因此结果是正确。这也是标准中为JavaScript显示的方法。