好的 - 这是我一段时间看到的最愚蠢的故障:
<!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>
放入我的代码中。有什么办法吗?
这种行为是否有正当理由?
答案 0 :(得分:5)
在X(HT)ML(当actually treated as such时)内,由于这个原因,脚本需要作为CDATA进行转义。 http://www.w3.org/TR/xhtml1/diffs.html#h-4.8
在XHTML中,脚本和样式元素被声明为具有#PCDATA内容。因此,
<
和&
将被视为标记的开头,而<
和&
等实体将被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显示的方法。