2010-10-12 144 views
12

几年前,我被教导说,嵌入到HTML的JavaScript代码块应该总是HTML注释里面被封装如下:我应该使用HTML注释来封装JavaScript代码块吗?

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

有人告诉我,要做到这一点,但我从来没有那种完全想通了,为什么。它那种似乎哈克使用HTML注释,所以现在我一直在使用开始写脚本块内我的JavaScript代码,而无需HTML注释:

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

所以我的问题是:我应该使用HTML注释封装JavaScript代码块?仅仅在没有评论的情况下编写脚本是否安全?我的意思是,当我忽略评论标签时,是否冒着某种风险?

回答

11

HTML注释旨在隐藏不理解<script>元素的古代浏览器中的JavaScript,而是在页面上呈现其内容。那是在90年代中期,iirc。 现在,您可以放心地假设那个时代的浏览器不再出现在网络上,并且忽略了评论。

上一些不错的历史,可以发现here

关于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的推出,微软推出了自己的等效JavaScript语言,他们称之为JScript。从那时起,所有的浏览器都至少识别脚本标签和更新的浏览器(Netscape 2+,IE3 +等),HTML注释不再需要。因此,一旦所有访问者升级到使用Netscape 2,Internet Explorer 3或比这两者中的任何一个更新的浏览器,脚本注释变成冗余代码。

+0

谢谢!这也是我的直觉。我还没有遇到过一个单一的客户,他在使用无意义JavaScript块的页面时遇到了问题。您是否也碰巧知道在哪些特定的浏览器中会发生这种不想要的行为? – jsalonen 2010-10-12 09:02:39

+0

@jsalonen:见编辑 – Joey 2010-10-12 09:05:25

+0

所以它确实是一个古老的要求。案件结案。谢谢! – jsalonen 2010-10-12 09:07:46

6

直接从the source

18.3.2从用户代理

不认识SCRIPT元素可能会渲染元素的内容文本

用户代理隐藏脚本数据。一些脚本引擎(包括JavaScript,VBScript和Tcl语言的脚本引擎)允许将脚本语句包含在SGML注释中。不识别SCRIPT元素的用户代理将因此忽略注释,而智能脚本引擎会理解应该执行注释中的脚本。

该问题的另一个解决方案是将脚本保存在外部文档中并使用src属性引用它们。发生在SCRIPT元素的开始

谈到脚本用JavaScript JavaScript引擎允许字符串“<!--”,并且忽略进一步字符到行的结尾。 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> 

此外,如果你真的想明白这一切意味着,读这excellent article。它很长,但值得它

+1

你能再指出一点:这种风险有多真实?你知道一些特定的浏览器,这样的行为? – jsalonen 2010-10-12 08:59:28

+0

没有支持HTML的半新版本的浏览器将呈现'

  • 11. 我可以在Visual Studio代码中使用行注释而不是块注释用于scss文件吗?
  • 12. 代码注释 - 是否应使用设计模式注释
  • 13. 我可以在C中使用我的网站封装PHP代码来构建iOS应用程序吗?
  • 14. 使用Javascript的HTML代码注入
  • 15. EF应该封装在基类中吗?
  • 16. 我可以使用代码添加/更改Java注释吗?
  • 17. 我应该用自己的类型封装id字段吗?
  • 18. 我应该封装我的IoC容器吗?
  • 19. 我应该释放self.view吗?
  • 20. 我应该释放NSImage吗?
  • 21. 我应该使用Vulkan装载机吗?
  • 22. 用于在Javascript中添加注释/注释的示例代码
  • 23. 我应该总是使用HTML Doctypes吗?
  • 24. 用C++封装C代码
  • 25. 我应该如何封装我的MVC-Action以避免代码重复?
  • 26. 注释后可以使用注释来调用方法吗?
  • 27. 我应该在块中使用“self”来访问类方法吗?
  • 28. 我应该使用代表块返回?
  • 29. 我应该使用ES6传输我的节点js代码吗?
  • 30. 我应该在我的PHP代码中使用assert吗?