脚本标记规则

时间:2012-09-18 01:35:39

标签: javascript html html-parsing

考虑以下html文档:

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

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

  

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

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

source code screenshot with </script> in the alert call

它显示的浏览器输出为"),因为它认为脚本标记已关闭 内部警报。如果我们确实想要显示"</script>",那么解决此问题的一种方法是:

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

现在Firefox了解它:

source code screenshot with "</" + "script>" in the alert call

问题:

解析器检查</script>是否为结束部分非常简单。它确实需要更多 是时候检查一下但它是可行的(在</script>遇到之前计算引号数。如果是偶数那么它是结束标记,否则继续寻找结束标记)。问题是,这是一条规则,我们不能在javascript中写"</script>"吗?如果是这样,我可能没有注意到哪些其他微妙的规则?

同样适用于php解析器。 <?php echo "?>" ?>。我测试了这个,php似乎知道真正的?>所在的位置。

1 个答案:

答案 0 :(得分:4)

正确,您无法在内嵌 Javascript中编写"</script>",但您可以编写"<\/script>"。在外部Javascript文件中,您没有此限制。

Javascript引擎会将"</script>"视为脚本的结尾,,无论其出现何种上下文。

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

XHTML,作为XHTML文件 [1]还有一些问题,包括--作为XHTML评论的开头和结尾。

[1]很少有XHTML内容实际上是XHTML。它通常用作HTML,然后由标签汤解析器处理,而不是从嵌入的HTML注释甚至不属于的CDATA标签中理解所有内容。