我应该使用HTML注释来封装JavaScript代码块吗?

11

几年前,我学到的是嵌入在HTML中的JavaScript代码块应该始终被封装在HTML注释中,如下所示:

<script type="text/javascript">
<!--
var hello = "world";
-->
</script>

我被告知这样做,但我从未完全弄清原因。使用HTML注释似乎有些取巧,所以现在我开始在script标签中编写我的JavaScript代码而不是使用HTML注释:

<script type="text/javascript">
var hello = "world";
</script>

那么我的问题是:我应该使用HTML注释来封装JavaScript代码块吗?如果没有注释,直接编写脚本是否安全?我的意思是,当我省略注释标记时,我会冒着什么风险吗?

2个回答

10

HTML注释旨在隐藏JavaScript代码,以免古老的浏览器无法理解<script>元素并在页面上呈现其内容。这追溯到90年代中期左右。 现在,您可以安全地假设那个时代的浏览器已不再存在于Web上,并省略注释。

关于此的一些有趣历史记录可以在这里找到:

关于浏览器不理解的HTML标签的一般规则是,浏览器应完全忽略该标签并将页面内容视为不存在该标签。这意味着当Netscape 2首次引入JavaScript(或当时称为LiveScript)时,有必要在实际脚本周围放置一个HTML注释,以便将代码隐藏起来,以免其他不理解脚本标签的浏览器显示代码而非运行它。

JavaScript语言特意编写为接受HTML注释作为脚本中的第一件事并忽略它,以便HTML注释可用于从使用Netscape 1、Mozaic、Internet Explorer 1、Internet Explorer 2等类似时代的浏览器中隐藏脚本。在“更早的”浏览器中,这些是“史前”的浏览器(在JavaScript术语中),当您在古老的JavaScript教程中看到将JavaScript包装在HTML注释中以避免它被“旧”浏览器捕获时,就是指这些浏览器。

随着Internet Explorer 3的推出,Microsoft引入了他们自己的等效于JavaScript的JScript。从那时起,所有浏览器至少能够识别脚本标签,更现代的浏览器(Netscape 2 +、IE3 +等)不再需要HTML注释。因此,一旦所有访问者升级为使用Netscape 2、Internet Explorer 3或比这两个浏览器更新的浏览器,注释掉脚本就变成了冗余代码。


谢谢!这也是我的猜测。我没有遇到过任何一个客户在没有注释的JavaScript块页面上出现问题。另外,您是否知道在哪些特定的浏览器中会发生这种不良行为? - jsalonen
这确实是一个古老的要求。案子结了。谢谢! - jsalonen
对于阅读此答案的任何人,请查看Marko的优秀答案,该答案提供了更详细的关于这个问题的解释。 - jsalonen

7

来自官方文档

18.3.2 隐藏脚本数据避免被用户代理解析

不识别 SCRIPT 元素的用户代理通常会将该元素的内容呈现为文本。包括 JavaScript、VBScript 和 Tcl 在内的一些编程语言的脚本引擎是允许在 SGML 注释中包含脚本语句的。因此,不识别 SCRIPT 元素的用户代理将忽略注释,而聪明的脚本引擎将理解要执行的注释中的脚本。

另一种解决问题的方法是将脚本保存在外部文件中,并使用 src 属性引用它们。

JavaScript 中的注释脚本 JavaScript 引擎允许字符串 "<!--" 出现在 SCRIPT 元素的开头,然后忽略直到行末的其他字符。JavaScript 将 "//" 解释为从当前行开始的注释。这是为了隐藏字符串 "-->" 以免被 JavaScript 解析器解析。

<SCRIPT type="text/javascript">
<!--  to hide script contents from old browsers
  function square(i) {
    document.write("The call passed ", i ," to the function.","<BR>")
    return i * i
  }
  document.write("The function returned ",square(5),".")
// end hiding contents from old browsers  -->
</SCRIPT>

此外,如果您真的想了解这一切的含义,请阅读这篇优秀文章。它很长,但是值得一读。

1
你能再具体说明一下吗:这个风险有多大?你知道有哪些特定的浏览器会出现这种情况吗? - jsalonen
任何支持半新版本HTML的浏览器都将呈现<script>元素内容。 - Joey
1
这只会影响使用Amigas的Mosaic用户,以及15年内没有升级Lynx的一些用户。 - Stan Rogers
@jsalonen,请查看我的更新以及@Stan和@Joey的评论。 - Marko
谢谢!你在这里提出了很好的观点。请注意,HTML 4.01规范是1999年编写的。因此,除非我真的想为旧版浏览器设计,否则似乎不必使用注释标记。我承认偶尔需要在JavaScript代码中转义HTML实体,对于这个任务,当然需要一个转义机制。但是,转义JavaScript超出了我的问题范围。 - jsalonen

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