Javascript Chrome中出现了非常奇怪的小故障-解析字符串的内容!
好的-这是我最近看到的最愚蠢的故障:Javascript Chrome中出现了非常奇怪的小故障-解析字符串的内容!,javascript,html,google-chrome,html-parsing,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/ja
<!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>
var数据=”;
这应该打破!
这会导致语法错误,因为JavaScript解析器实际上正在读取字符串的内容。多么愚蠢
如何将
放入代码中。有办法吗
这种行为是否有合理的原因?在X(HT)ML(when)中,正是出于这个原因,脚本需要作为CDATA转义
在XHTML中,脚本和样式元素被声明为具有#PCDATA内容。因此,
如果您的XHTML文档只是作为text/html,并被视为标记汤,则这不适用,您只需像'
这样“转义”字符串:
<!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>
这应该打破!
原因很简单,HTML是在执行javascript之前解析的,
使解析器忽略本节中出现的所有标记。这不是一个小故障-这是正常的预期行为,如果您仔细想想,这是正确的。HTML规范没有定义脚本语言,因此引擎应该看到的是纯文本,直到关闭标记。除了已经列出的选项外,还有两个选项:
// escape the / character, changing the format of the "closing" tag
var data = "<\/script>";
// break up the string
var data = "</"+"script>";
//转义/字符,更改“closing”标记的格式
var数据=”;
//拆线
var数据=”;
第一种方法之所以有效,是因为HTML不使用\
进行转义,而是将其视为文字字符,当然
不是有效的结束标记。第二个脚本之所以有效,原因更为明显,但这里有人告诉我不应该使用它(我也不太明白为什么)。如果你相信的话,脚本内容
在第一个ETAGO结束("转义有什么问题?不仅仅是Chrome。我在Windows 7上的Firefox 3.6上测试了它,它也给出了同样不正确的结果。转义?就像/script
?也不起作用。@Xavier Ho:结果是正确的,期望是错误的。那么期望是什么呢?重点是HTML没有定义单独的它解析字符串的脚本类型以及字符串中的HTML标记无效。当它看到
时,它只会查找
-它不关心脚本中的字符串是什么。CDATA…哦,是的。我忘记了。我总是用ActionScript来做。忘记了你可以用JavaScript来做…:)啊。我明白了。哦,好吧。你提出的另一个解决方案似乎行得通,第二个似乎行得通。我不知道为什么我也不使用它。@George:不管怎样,第一个对我来说更可取,只是觉得把两个字符串文本分开是不对的;-)如果脚本包含字符串中的“-->”
,该怎么办?;-)
// escape the / character, changing the format of the "closing" tag
var data = "<\/script>";
// break up the string
var data = "</"+"script>";
var data = "<\/script>";