JavaScript <!-- //--> 是必需的吗?

Posted

技术标签:

【中文标题】JavaScript <!-- //--> 是必需的吗?【英文标题】:JavaScript <!-- //--> are required? 【发布时间】:2011-12-24 09:09:05 【问题描述】:

我只是想问一下标题是什么意思。 html 脚本标签中需要以下字符串?

<!--
//-->

如果我不使用它们会怎样?

【问题讨论】:

有人可以向我解释为什么这个问题已经得到了 6 票吗?只需在 Google 中输入标题即可回答这个问题,因此:不费吹灰之力。 @CodeCaster:唯一重要的是问题是否问得好并且不重复。从长远来看,SO 可能是比 Google 更好的参考。 (这还不包括谷歌在索引符号和奇怪的运算符方面有多糟糕) 我可以否决评论吗? (在 Google 中输入 javascript &lt;!-- //--&gt; are required?不是很有用。) 我很确定这已经在 SO 上被问过好几次了。 我没有研究工作.. 【参考方案1】:

除非您的目标是早于 &lt;script&gt; 元素的浏览器(即 Netscape 1 和朋友)。 (提示:你不是)。

如果您不使用它们,并且旧的浏览器(太旧,它甚至无法处理使用虚拟主机的站点所需的 HTTP Host 标头)尝试访问该站点,那么&lt;script&gt; 元素将被视为要显示的文本。

延伸阅读:Comments and CDATA: The mysterious history of script and style in HTML

【讨论】:

我不会说“提示:你不是”,而更像是“提示:如果你是,那你做错了” Álvaro 在他的回答中提出了一个重要的观点:如果没有 CDATA 转义,如果脚本中包含诸如 &lt; 之类的元字符,则该页面不再是有效的 XML。我认为依靠应用程序默默地修复无效数据是不好的风格。 @Simon Richter — 问题是关于 HTML,而不是 XHTML。它还专门关于在脚本块周围使用 cmets。 (我提供的链接中提到了 XHTML 问题 以供进一步阅读)【参考方案2】:

如果你不使用它们,90 年代初的浏览器可能会显示源 JS 代码而不是运行它。

【讨论】:

【参考方案3】:

不,它们不是必需的。 这个习惯是支持真正旧的浏览器所必需的,并且与包含 CDATA 标记稍有相关,这些标记应该包含在验证中。它们都不是必需的,但从一些更详尽的答案中可以清楚地看出,它们服务于或已经服务于它们的目的。

见:When is a CDATA section necessary within a script tag?

【讨论】:

CDATA 标记与“真正的旧浏览器”无关,它们用于使用 XML 解析器解析 XHTML 的浏览器(即正确)。 cmets 与验证无关(除非它们在 XHTML 中被误用)。 我已经重新措辞以更清楚我的意思,但你当然是绝对正确的。 @Quentin 我认为实际上并没有什么正式禁止将内容作为文本内容包含在内 - 只是你需要将每个大于/小于/& 符号作为 html 实体转义.使用 CDATA 意味着您只需要处理不常见的字符序列]]&gt;(您可以通过在两个标记之间简单地包含一个空格来完成) @Random832 — 我没有说数据被禁止作为文本内容。你不能总是通过将]]&gt; 更改为] ]&gt; 来处理它……因为那是不同的内容。【参考方案4】:

谷歌“为什么要在 html 中注释掉 javascript”,第一次点击:

http://www.howtocreate.co.uk/tutorials/javascript/incorporate

这不再需要了。所有当前的浏览器都知道脚本标签,以及如何处理它们的内容,因为它们从 HTML 3 开始就是 HTML 的一部分。不理解 HTML 3 或脚本(现在几乎从未使用过)的浏览器将显示脚本,就好像这是页面的内容。您可以通过使用标准 HTML cmets 注释掉您的脚本来隐藏脚本。

【讨论】:

【参考方案5】:

99% 的情况下,它们不再需要 :) 除非您运行一些 非常旧的 浏览器!

【讨论】:

【参考方案6】:

可能发生的更糟糕的事情是,您的页面被不知道&lt;script&gt; 标记的用户代理检索并尝试将您的脚本块解析为常规HTML。 JavaScript 代码将作为常规文本处理,&lt; 符号可能会干扰页面标记。一个强制的例子:

<script type="text/javascript">
if(a<del || a>b)
    foo();

</script>
Lorem ipsum dolor sit amet.

... 可以呈现为丑陋的删除文本:

if(ab) foo(); Lorem ipsum dolor sit amet。

这些过时的用户代理是否存在?哦,他们当然知道。请注意,我已经小心避免使用“浏览器”这个词。问题不在于如今谁在使用 Mosaic。这是因为您的网站可以被编写不佳的基于 php 的正则表达式解析器读取。

你应该关心吗?好吧,可能不是:)

【讨论】:

这种行为甚至还没有过时。 @Simon Richter — 是的。当浏览器无法识别 &lt;script&gt; 元素(自 HTML 3.2 以来已定义)(或在 XHTML 中,此问题与此无关)时,就会发生这种行为【参考方案7】:

对于有效 HTML,你的内联 JavaScript 应该是 HTML 转义的。

如果您要编写如下脚本:

<script type="text/javascript">
  document.write('<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>');
</script>

会有一个问题,因为脚本包含&lt;/script&gt;,它将关闭 first 开始脚本标记。旧的用户代理在 JavaScript 转义不佳方面存在各种问题,并且更容易告诉人们使用:

<script>
  //<!--
  //-->
</script>

与其说教人们写剧本,不如说:

<script type="text/javascript">
  document.write('&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;');
</script>

请注意,JS cmets 用于阻止 JavaScript 引擎尝试执行 &lt;!----&gt;,这可能是合法的语句(a&lt;!--ba--&gt;b)。

比解释他们实际上需要将每个" 转为&amp;quot;&amp;lt; 转为&amp;lt;&amp;gt; 转为&amp;gt;&amp;amp; 转为&amp;amp; .

对此的“现代”修复是使用字符数据元素,它告诉文档包含的所有内容都应视为文字:

<script type="text/javascript">
  /* <![CDATA[ */
  /* ]] */
</script>

在这种情况下,我使用了多行 cmets,以便在将代码缩小为单行时不会损坏代码(一些富文本编辑器过去曾对我这样做过)。

最好的解决方案是将所有 HTML 保存在 .html 文件中,将所有 CSS 保存在 .css 文件中,将所有 JS 保存在 .js 文件中。您永远不必担心 HTML 会转义您的 JavaScript,只需插入一个新的 &lt;script&gt;,您就可以在其他地方重用您的 JS。

【讨论】:

存在三个独立的问题,“XHTML 中具有特殊含义的字符”、“HTML 中的&lt;/ 序列”和“无法识别&lt;script&gt; 元素的浏览器”,您将得到他们在这里有些混为一谈。例如document.write('&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/jquery-latest.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;'); 不会在 HTML 文档中工作,也不会在注释中包装 &lt;script&gt; 的内容会阻止第一个 &lt;/script&gt; 结束脚本(中间 JS 字符串)。 我相信字符序列 &lt;!-- 在 JavaScript 中被视为开始一个单行注释(相当于 //),至少在某些用户代理中是这样。不过,我目前找不到这方面的参考资料。 @DanielPryden,不管怎样,html5 spec 指定评论不能包含两个连续的减号 (--),这应该是一个大红旗作为原因 在 JavaScript 周围使用注释。 @zzzzBov:我认为这不适用于这种情况。 -- 不能出现在 HTML 注释 中,但 JavaScript cmets 不是一回事。 @Daniel Pryden — 否。&lt;!-- 是 HTML 注释,the JS engine ignores,不等同于 //。您不能在其中包含 --,因为它旨在保护的旧用户代理应将 -- 视为注释的结尾。【参考方案8】:

以这种方式评论 JavaScript 代码也可能会阻止内容在搜索引擎中被编入索引,并且在某些情况下可能是可取的。

例如,前段时间我在谷歌站长工具中发现了很多“找不到页面”的问题。在对 url 进行简单分析后,我清除了 Google 从我的 JS 代码中获取所有类似路径的变量(如“name/001”),将它们与当前 url (mysite.info/staff) 加入并尝试请求结果网址。当然没有成功。

在一些 JS 块中插入&lt;!-- //--&gt; 后,所有“找不到页面”问题在一两个月内就消失了。

【讨论】:

以上是关于JavaScript <!-- //--> 是必需的吗?的主要内容,如果未能解决你的问题,请参考以下文章

javascript工具函数

纯js 原生JavaScript 转义 还原 html标签

作为 javascript 函数的结果,在 g:remoteLink 中传递参数

javascript 层缩放问题(望得贵人帮忙)解决问题再加分,谢谢!

HTML代码转换为JavaScript字符串

jQuery ListNav Plugin 怎么使用