HTML的注释标签可以作为有效的JavaScript代码吗?

12

一个应对旧版浏览器忽略HTML页面中的JavaScript块的老措施是将<script>元素的内容包裹在HTML注释中:

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

这样做的原因是旧浏览器不支持JavaScript,会将<script>元素中的内容呈现为文本。因此,在HTML注释中放置JavaScript代码可以使浏览器没有内容可呈现。

另一方面,现代浏览器会看到<script>元素并解析其中的内容作为JavaScript代码。因此,注释必须是有效的JavaScript代码。关闭的HTML注释(-->)由于之前有JavaScript行注释(//),所以被JavaScript解析器忽略。

我的问题是:开头的HTML注释(<!--)如何不会导致JavaScript解析器失败?我从各种人那里听说过,开头的HTML注释是有效的JavaScript代码。如果开头的注释被评估为JavaScript,执行时它会做什么呢?


它是合法的,只需将其插入控制台即可。不过我很想知道为什么。 - kapa
1
当执行时,它返回未定义,并像常规的//注释一样工作。看起来像是硬编码的魔术字符串?也很好奇知道实际答案。 - c69
不错的点子 :) 从现在开始会像这样做行注释,只是为了逗人开心 :D - clentfort
1
@c69:看起来这是目前为止最好的答案:很棒! - Daniel
1
根据javascripter.net的说法,浏览器支持3种类型的注释: `// 斜杠-单行注释<!-- html-单行注释 /* 斜杠星号-多行注释 */` 这不是标准ECMA-262。但我认为浏览器添加它的原因是显而易见的。 - SublimeYe
2个回答

7

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

结果证明,<!--在Javascript中等同于//,用于注释掉一行代码。

这是一种语言特性,似乎没有很好的文档记录,可能是为了支持这个“hack”而添加的。现在我们必须使用它以保持向后兼容性。

不用说,虽然这是一个有趣的知识点,但这种注释方式不应该在其他人可能会阅读和使用的真实代码中使用。

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


3
在另一个StackOverflow问题中,@MathiasBynens给出了我认为是答案为什么HTML注释开放块是有效的JavaScript? 简而言之,显然这是浏览器JS引擎的非标准添加,允许这些<!---->作为单行注释标记,就像标准JS中的//一样。

我没有意识到闭合(HTML)注释也被认为是JavaScript注释。在Firefox的JS控制台中检查过了,但我想知道为什么人们仍然使用“//-->”。也许“-->”最近才被解释为JS注释? - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接