12

让非常旧的浏览器忽略 HTML 页面中的 JavaScript 块的一个老习惯是将<script>元素的内容包装在 HTML 注释中:

<script>
    <!--
        alert("Your browser supports JavaScript");
    //-->
</script>

基本原理是旧的无 JavaScript 浏览器会将<script>元素的内容呈现为文本,因此将 JavaScript 放在 HTML 注释中会使浏览器无法呈现任何内容。

另一方面,现代浏览器将看到<script>元素并将其内容解析为 JavaScript。因此,注释必须是有效的 JavaScript。JavaScript 解析器会忽略结束 HTML 注释 ( -->),因为它前面有一个 JavaScript 行注释 ( //)。

我的问题是,打开的HTML 注释 ( <!--) 如何不会导致 JavaScript 解析器失败?我从很多人那里听说开头的 HTML 注释是有效的 JavaScript。如果开头评论确实被评估为 JavaScript,那么它在执行时会做什么?

4

2 回答 2

7

这似乎是一件令人兴奋的事情,一个可能有特殊含义的表达式(<,!并且--都是 Javascript 中的运算符),但是没有操作数就没有意义。

事实证明,这<!--简直等同//于 Javascript,它是用来注释掉一行的。

这是一种语言功能,但似乎没有很好的文档记录,并且可能出于支持这种“hack”的简单原因而被添加。现在我们必须忍受它,以免破坏向后兼容性。

不用说,虽然这是一件有趣的事情,但这种类型的注释不应该用于其他人可能碰巧阅读和使用的实际代码中。

“hack”也已过时,因为现在每个浏览器都能理解<script>标签并且不显示其内容(即使 Javascript 已关闭)。就个人而言,在大多数情况下,我尽量避免将 Javascript 直接写入 HTML,并始终将我的 Javascript 作为外部资源加载以分离 HTML 和 Javascript。

于 2012-10-27T09:20:49.583 回答
3

在另一个 StackOverflow 问题中,@MathiasBynens 给出了我认为答案:

为什么 HTML 注释打开块是有效的 JavaScript?

简而言之,显然,这是对基于浏览器的 JS 引擎的非标准补充,它允许这些引擎<!--以及像标准 JS 中-->的单行注释标记。//

于 2013-09-05T13:53:39.927 回答