【问题标题】:HTML comments in a javascript block?javascript块中的HTML注释?
【发布时间】:2018-06-26 10:30:24
【问题描述】:

我有一个像下面这样的函数,它在 HTML 页面中插入一段 HTML 代码:

function someEventHandler(htmlContent)
{
  document.getElementById('some-element-id').innerHTML = htmlContent;
}

这适用于包含 img 标记的 HTML 代码。

但是,当 HTML 代码包含 <script> 块时,它们不会呈现。此外,脚本块包含被 HTML cmets 包围的 JavaScript。例如:

<script type="text/javascript">
<!--
    function someFunctionThatRendersStaticImageOrFlash()...
-->
</script>

这些包含 HTML cmets 的脚本块在插入后不会呈现。我可以控制插入的代码,并且在没有 HTML cmets 的情况下对其进行了测试,并且它们成功呈现。

据我了解,像这样的 HTML cmets 在早期版本的 Netscape 中使用,以防止浏览器与 javascript 不兼容的问题。

是否有任何其他理由(或任何好的理由)在 javascript 块中包含 HTML 样式的 cmets?

编辑 我打错了。最后的评论是://--&gt;

【问题讨论】:

  • 这不就是一个穷人的 CDATA 包装器吗?我从来没用过。

标签: javascript html


【解决方案1】:

实际上,只有&lt;!-- 是有效的javascript。要结束javascript中的html注释,实际上需要使用//--&gt;

如今,不再需要在 Javascript 中使用 HTML cmets。太旧以至于无法理解&lt;script&gt; 标签的浏览器极不可能能够在“现代”网站上呈现大部分内容,并且您不应该必须容纳完全使用石器时代浏览器的用户.

但是,如果您打算将 HTML 包含在 xml 文档中,和/或正在编写 x-html,那么您必须使用 xml &lt;![CDATA[]]&gt; 附件作为各种 Javascript 运算符(尤其是&amp;&lt;&gt;)将导致没有附件的 XML 解析错误。

【讨论】:

  • 谢谢马克!我刚刚打错了结束评论,实际上是您输入的方式 - //--&gt;。我相信代码起源于通过谷歌的双击服务的自动化工具。希望我以后可以编辑自动化代码。
  • 实际上,--&gt; 在行首时被视为SingleLineComment(等效于//),前面可选空格或MultiLineComments。见my answer
【解决方案2】:

这是浏览器和 JavaScript 引擎一直实现的以前非标准功能。如今,它不能从 Web 平台中删除,因为这会破坏向后兼容性。我是detailed in the JavaScript / Web ECMAScript spec

&lt;!-- 必须被视为 SingleLineComment 的开头 — 相当于//

var x = true;
<!-- x = false; // note: no syntax error
x; // true

--&gt; 位于行首,前面可选空格或 MultiLineComments,必须被视为SingleLineComment — 相当于//

var x = true;
--> x = false; // note: no syntax error
x; // true

var x = 1;
/*
multiline comment!
x = 2;
*/ --> x = 3;
x; // 1

更新:现在是upstreamed to the ECMAScript spec。有关更多背景信息,请参阅Sunsetting the JavaScript Standard

【讨论】:

【解决方案3】:

不,没有理由包含它们。我经常忽略那些 cmets,并且对现代浏览器没有任何问题。

【讨论】:

    【解决方案4】:

    &lt;script&gt; 内部通过innerHTML 设置的字符串永远不会运行(主要是因为它在 IE 中从来没有,然后网站依赖于它,所以当其他浏览器对 innerHTML 实现进行逆向工程时,他们也必须这样做)。 HTML cmets 有一条红鲱鱼。

    如果您需要&lt;script&gt; 运行,则需要使用其他插入节点的方法(例如createContextualFragment)。

    【讨论】:

    • 嗯,这就是实际使用的(jQuery):$('#some-element-id').html(htmlContent);
    • @MikeMoore - jQuery 检测传递给 html() 的字符串何时包含脚本块,如果是,则不使用 innerHTML。它将显式地为您提取脚本块和eval() 它们。详情请见this thread
    【解决方案5】:

    脚本块中的 HTML cmets 多年来一直没有必要。省略它们不会导致任何问题。

    参考:http://javascript.crockford.com/script.html

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2014-11-12
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多