可以嵌套HTML注释吗?


96

按照标题;是否可以在有效的HTML中嵌套注释?请参阅下面的示例...

<p>some text</p>

  <!-- comment 1

    <p>commented out html</p>

    <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

    <p>more commented out html</p>

  end of comment 1 -->

<p>some more text</p>

似乎没有,有人知道我如何才能使用嵌套注释吗?


4
...或者我认为这是不可能的,但是也许比我知道的人经验更多!
QAZ

如果对HTML中的有效内容有疑问,我通常会追逐标准专家。具体来说,validator.w3.org上
Mawg说,请恢复Monica 2010年

Answers:


103

嵌套注释时,将“-”替换为“--”。取消嵌套时,请执行相反的步骤。不是<!--被禁止的,而是被禁止的--

例:

<!-- some stuff
<!- - some inner stuff - ->
<!- - a sibling - ->
the footer -->

4
这是否意味着内部评论不再是适当的评论?
S.Lott

10
是的,HTML和XML不允许使用<!-嵌套注释。您可以在自己的代码中执行的操作是定义注释元素,并在解析过程中主动忽略它。
亚伦·迪古拉

1
请注意,您应该更换--使用- - 的内部(嵌套)评论
ebosi

3
如果将“-”更改为“--”,则不再是注释。这不是一个解决方案,但周围的方式,你也可以使用“<% -您的评论- %>的办法解决。
阿南特·辛格

如何评价和接受这个最佳答案?甚至都行不通!哎呀 请阅读以下Dave Land的说明
John E

97

TL; DR:不幸的是,不,这是不可能的(而且永远不会)。

简短答案:

HTML注释并不是很多人认为的那样。HTML是SGML的一种形式,其中注释用双破折号(--...)分隔。 --)。

因此,在一对尖括号内的任何一对双破折号都带有一个尖括号,该尖括号在开括号(<! ---- >)之后。规范说得比我更好:http : //www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

这就是为什么这样的评论(我们可能已经做过一次或多次)是一个主意的原因:

<!-------------------标题从这里开始--------------------->

真相:我懒得告诉您上述标记污染代表了多少评论,但至少有10条。

我不那么懒惰:所谓的“评论”实际上包括10条评论,任何评论之外的三个词(即,糟糕的SGML)以及未终止的评论的开头。真是一团糟:

<!--1 ----2 ----3 ----4 ----5--
标头从这里开始
--6 ----7 ----8 ----9 ----10-- -->

当然,这不是简单,因为在每个浏览器选择如何解释规范的差异。

这是一篇很好的文章,对它进行了解释:

    http://weblog.200ok.com.au/2008/01/dashing-into-trouble-why-html-comments.html

长答案:为什么我们弄错了

我们大多数与HTML一起成长的人(没有深入研究作为其基础的SGML)已经开始相信该字符串<!--以注释开头,并且该字符串-->以注释结尾。

其实,<!>界定你的HTML文档内的SGML声明,如DOCTYPE声明我们都看到在我们的网页上。 SGML声明中,注释用双破折号分隔。因此,HTML注释

<!-这是评论->

我们大多数人会认为这样解析的<!-- this is a comment -->实际上是这样解析的:
<!-- this is a comment -->。这是一个SGML声明,除注释外为空。

因为HTML是SGML的一种形式,所以“声明内的注释”充当HTML注释。

出于兴趣,下面是一个纯SGML块,它显示了注释在SGML中的预期功能:此属性列表定义在每一行包含一个注释:

<!ATTLIST链接
  %attrs; -%coreattrs,%i18n,%events-
  字符集%字符集; #IMPLIED-链接资源的char编码-
  href%URI; #IMPLIED-链接资源的URI-
  hreflang%LanguageCode; #IMPLIED-语言代码-
  类型%ContentType; #IMPLIED-咨询内容类型-
  rel%LinkTypes; #IMPLIED-转发链接类型-
  rev%LinkTypes; #IMPLIED-反向链接类型-
  媒体%MediaDesc; #IMPLIED-用于在这些媒体上呈现-
>

1
有趣。我想知道html5解析是否仍然如此。
2013年

1
不幸的是,是的,这仍然是事实,因为它是所有HTML(包括HTML5)所基于的SGML基础的一部分。改变几乎是不可能的。
戴夫·兰德

8

无法完成。-->将始终结束现有的HTML注释。


4
其他编程语言(例如LUA)也允许。== [[和== [1 [是两个单独的注释块的开头。我看不出为什么有一天HTML不能做同样的事情。
约翰·克特吉克

7

如果您确实对某些HTML感兴趣-在某些不可控制的源代码中预渲染-包含注释,并且需要确保所有HTML内容均未呈现在您的页面上,则可以始终使用以下script标记将其包装起来,唯一的事情是,您不能以script这种方式注释掉标签。

<p>some text</p>

<!-- multiline "comment" below using script type="text/html" -->
<script type="text/html">

  <p>commented out html</p>

  <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

  <p>more commented out html</p>

</script>

<p>some more text</p>

如果您需要注释掉script标签,则可以改用textareaas包装器,这当然是不可行的,您不能注释掉textarea标签。

<p>some text</p>

<!-- multiline "comment" below using textarea style="display:none;" -->
<textarea style="display:none;">

  <script>  

    alert("which won't show up..");  

  </script>

  <p>commented out html</p>

  <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

  <p>more commented out html</p>

</textarea>

<p>some more text</p>


1
聪明!但是,如果HTML代码已经包含<script>标签该怎么办...
Willem

3
@Willem,更新了一个额外的方法,答案可能在方案中工作..
Mathijs Flietstra

1
谢谢,这是一种新颖的方式。也许您也可以将其包装在JS注释块中:/* */
Willem

7

使用template标签。阻止所有评论和其他html出现的最快方法。

<template>
    <!-- first paragraph-->
    Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    <!-- second paragraph-->
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</template>

    <!-- third paragraph-->
    Ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.sunt in culpa qui officia deserunt mollit.

<template>元素不能只在任何地方添加。它的父元素必须是元素,也可以是少数几个选择<body>元素。
约翰E

1

一些编辑器具有注释/取消注释命令,这些命令可以自动处理文本块中的现有注释。例如,当您按Ctrl + KC和Ctrl + KU时,Visual Studio就是这样做的。


我正在尝试您针对VS2013中的嵌套html注释使用Ctrl + KC和Ctrl + KU所说的内容,但是很遗憾,它没有处理它。
Mahdi Alkhatib's

1

一个VS插件通过自动伪造嵌套的注释将其转换<!--...--><!~~...~~>然后注释掉整个部分。它使您可以打开和关闭它。

嵌套评论


0

我认为这是不允许的,但据我所知,它可以在除Firefox之外的大多数主要浏览器中使用。


0

尝试使用这个

<!-- 

这是评论的开始

<%-- this is another comment --%>

<%-- this is another one --%>

--> 评论的结尾。


0

试试这个

<p>some text</p>
<comment> comment 1
<p>commented out html</p>
<!-- comment 2
  // are nested html comment allowed?
end of comment 2 -->
<p>more commented out html</p>
end of comment 1 </comment>
<p>some more text</p>

1
你可以解释吗?我不知道<comment>HTML 中的关键字
Mawg说要恢复Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.