4

考虑以下 html 文档:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
alert("Hello")
</script>
</head>
</html>

在 Firefox、Safari 和 Chrome 中打开的结果在我的 macbook 中是相同的:一条警告消息显示“Hello”。我正在阅读答案以尝试了解浏览器的行为。主要部分是:

由于标签的内容被视为 CDATA,因此内容不会被解析,您可以在内容中存储不带引号的 XML 或 HTML(只要您从未</script>在内容中放置标签,因为这会关闭您的元素)。

让我们试试当我们在 Firefox 中看到源代码时会发生什么:

警报调用中带有 </script> 的源代码屏幕截图

它显示的浏览器中的输出是")因为它认为脚本标记已在警报中关闭。如果我们真的非常想展示,克服这个问题的一种方法"</script>"是:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
alert("<"+"/script>")
</script>
</head>
</html>

现在 Firefox 明白了:

源代码截图

问题:

解析器检查是否</script>是结束部分非常简单。检查这一点确实需要更多时间,但它是可行的(在遇到 之前计算引号的数量</script>。如果是偶数则它是结束标签,否则继续寻找结束标签)。问题是,这是我们不能"</script>"在 javascript 中编写的规则吗?如果是这样,还有哪些我可能不知道的微妙规则?

说 php 解析器也是如此。<?php echo "?>" ?>. 我已经对此进行了测试,并且 php 似乎知道真实?>的位置。

4

1 回答 1

4

正确,你不能"</script>"在内Javascript 中编写,但你可以编写"<\/script>". 在外部 Javascript 文件中,您没有该限制。

Javascript 引擎将"</script>"视为脚本的结尾,而不管它出现的上下文。

只要您使用的是 HTML 而不是 XHTML,那就是唯一真正的问题。

XHTML,作为一个 XHTML 文件[1] 有更多的陷阱,包括--作为XHTML注释的开头和结尾。

[1] 很少有 XHTML 东西实际上是 XHTML 服务的。它通常作为 HTML 服务,然后由标签汤解析器处理,这样可以理解嵌入的 HTML 注释甚至CDATA不属于的标签中的所有内容。

于 2012-09-18T01:57:22.127 回答