在 JavaScript 刚发布的时候,市面上的其它浏览器(甚至包括 Netscape Navigator 的旧版本),都不支持 script
标签。当遇到不认识的标签时,浏览器有两种处理方式:
- 将其直接作为文本打印到屏幕上
- 直接丢弃
第二种情况不用考虑,反正不能执行,丢弃掉也无所谓。而第一种情况则不行,这样做会把网站的源代码直接暴露到用户面前。
但是浏览器已经发布出去了,又不能撤回。那针对这种情况,应该如何做兼容呢?
其实是一个很巧妙的做法:利用 HTML comment
。
HTML comment
有一种特殊的书写方式:
<div>
<!-- this is a line of comment -->
<!--
multiline comment
-->
</div>
如果我们像下面这样写呢?
<button onclick="print()">print<button>
<script>
<!--
function print() {
console.log('this is a script block that\'s wrapped in a piece of html comment')
}
-->
</script>
既然 script
标签会被不兼容的浏览器处理成文本,那么利用 comment
的特殊书写方式则可以避免文本被打印出来。而支持 script
标签的浏览器再对 script
标签内的 HTML comment
做处理,这样不管浏览器是否支持 script
标签,就都不会有问题了。
兼容性
chrome、safari、Edge 至今都对这种写法表示兼容。
best practice
这样是 best practice 么?
显然不是。当今市面上的任何一款浏览器都已经对 script
标签做了完善的支持(到 ES5),这种做法已经没有必要了。更何况 JavsScript 已经是前端届的标配了,如果一款浏览器不支持 JavaScript,就代表着这个世界上的绝大部分网站无法在其之上正常运行,何谈使用一说。
注:本文仅供读者了解浏览器发展历史使用,作者亦不建议使用上述 hack 方法。