Comentários HTML aninhados são possíveis?

96

conforme o título; é possível ter comentários aninhados em HTML válido? veja o exemplo abaixo ...

<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>

Parece que não. Alguém sabe como posso fazer com que os comentários aninhados funcionem?

QAZ
fonte
4
... ou não acho possível mas talvez alguém com mais experiência do que eu saiba!
QAZ
Em caso de dúvida sobre o que é válido em HTML, geralmente vou direto ao assunto e vou seguindo os padrões, caras. Especificamente, o W3C Markup Validation Service em validator.w3.org
Mawg diz reintegrar Monica

Respostas:

103

Ao aninhar um comentário, substitua "-" por "- -". Ao retirar o aninhamento, inverta o procedimento. Não é o <!--que é proibido, mas o --.

Exemplo:

<!-- some stuff
<!- - some inner stuff - ->
<!- - a sibling - ->
the footer -->
Aaron Digulla
fonte
4
Isso significa que o comentário interno não é mais um comentário adequado?
S.Lott
10
Sim, HTML e XML não permitem aninhar comentários usando <! -. O que você pode fazer em seu próprio código é definir um elemento de comentário e ignorá-lo ativamente durante a análise.
Aaron Digulla
1
observe que você deve substituir --por - - para o comentário interno (aninhado) .
ebosi
3
Se você alterar "-" para "- -", não será mais um comentário. Não é uma solução, mas uma maneira de contornar, você também pode usar "<% - seu comentário -%> para contornar.
Anant Singh
Como isso foi votado e aceito como a melhor resposta? Nem funciona! Geesh. Leia a explicação de Dave Land abaixo.
John E
97

TL; DR : Infelizmente, não, não é possível (e nunca será).

Resposta curta:

Um comentário HTML não é exatamente o que muitos pensam que é. HTML é uma forma de SGML, em que os comentários são delimitados por pares de travessões duplos ( --... -- ).

Portanto, qualquer par de traços duplos dentro de um par de colchetes angulares com um ponto de exclamação após o colchete de abertura ( <! ---- >) é um comentário. A especificação diz isso melhor do que eu: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

É por isso que comentários como este (que temos tudo provável feito uma vez ou outra) são uma ideia:

<! - ------------------ O CABEÇALHO COMEÇA AQUI -------------------- ->

Verdade: tenho preguiça de dizer quantos comentários são representados pela poluição da tag acima, mas são pelo menos 10.

Fiquei menos preguiçoso: este assim chamado "comentário" consiste, na verdade, em 10 comentários, três palavras fora de qualquer comentário (ou seja, apenas SGML ruim) e o início de um comentário que não foi encerrado. É uma verdadeira bagunça:

<!--1 ----2 ----3 ----4 ----5--
O HEADER COMEÇA AQUI
--6 ----7 ----8 ----9 ----10-- -->

Claro, não é tão simples, devido às diferenças em como cada navegador escolhe interpretar as especificações.

Aqui está um excelente artigo que explica isso:

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

Resposta longa: por que erramos

A maioria de nós que cresceu com HTML (sem mergulhar no SGML que está por trás disso) passou a acreditar que a string <!-- começa com um comentário e a string -->termina com um comentário.

Na verdade, <!e >delimite uma declaração SGML dentro de seu documento HTML, como a declaração DOCTYPE que todos vimos no topo de nossas páginas. Dentro uma declaração SGML, os comentários são delimitados por travessões duplos. Assim, o comentário HTML

<! - este é um comentário ->

que a maioria de nós acreditaria que é analisado assim, <!-- this is a comment -->na verdade é analisado assim:
<!-- this is a comment --> . É uma declaração SGML vazia, exceto por um comentário.

Porque HTML é uma forma de SGML, este "comentário dentro de uma declaração" funciona como um comentário HTML.

Sem interesse, aqui está um pedaço de SGML puro que mostra os comentários funcionando como pretendidos no SGML: esta definição de lista de atributos contém um comentário em cada linha:

<! ATTLIST LINK
  % attrs; -% coreattrs,% i18n,% events -
  charset% Charset; #IMPLIED - codificação de caracteres do recurso vinculado -
  href% URI; #IMPLIED - URI para recurso vinculado -
  hreflang% LanguageCode; #IMPLIED - código de idioma -
  type% ContentType; #IMPLIED - tipo de conteúdo consultivo -
  rel% LinkTypes; #IMPLIED - tipos de link de encaminhamento -
  rev% LinkTypes; #IMPLIED - tipos de link reverso -
  media% MediaDesc; #IMPLIED - para renderização nessas mídias -
>
Dave Land
fonte
1
Interessante. Eu me pergunto se isso ainda é verdade para a análise de HTML5.
Kzqai
1
Infelizmente, sim, ainda é verdade, porque é parte dos fundamentos SGML subjacentes nos quais todo HTML, incluindo HTML5, é baseado. É quase impossível que isso mude.
Dave Land
8

Isso não pode ser feito. -->sempre encerrará um comentário HTML existente.

Sergio
fonte
4
Outras linguagens de programação como LUA permitem isso. == [[e == [1 [são o início de dois blocos de comentários separados. Não vejo razão para que algum dia o HTML não possa fazer a mesma coisa.
john ktejik
7

Se você estiver realmente preso a algum pedaço de HTML - pré-renderizado em alguma fonte incontrolável - que contém comentários, e você precisa ter certeza de que nenhum deles seja renderizado em sua página, você sempre pode envolvê-lo com uma scripttag como a abaixo, a única coisa é que você não pode comentar as scripttags dessa maneira.

<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>

Se você precisar comentar as scripttags, você pode usar um textareacomo wrapper; é claro, fazendo isso dessa forma, você não pode comentar as textareatags.

<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>

Mathijs Flietstra
fonte
1
Inteligente! Mas o que fazer se o código HTML já contém tags <script> ...
Willem
3
@Willem, atualizou a resposta com uma abordagem adicional que pode funcionar em seu cenário.
Mathijs Flietstra
1
Obrigado, essa é uma maneira nova. Talvez você também possa embrulhar a coisa em blocos de comentário JS:/* */
Willem
7

Use templatetag. A maneira mais rápida de bloquear a exibição de todos os comentários e outros 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.
Dexter
fonte
O <template>elemento não pode ser adicionado em qualquer lugar. Seu elemento pai deve ser o <body>elemento ou alguns outros selecionados .
John E
1

Alguns editores possuem comandos para comentar / descomentar que podem tratar automaticamente os comentários existentes em um bloco de texto. O Visual Studio, por exemplo, faz isso quando você pressiona Ctrl + KC e Ctrl + KU.

Dirk Vollmar
fonte
Estou tentando o que você disse para Ctrl + KC & Ctrl + KU para comentários html aninhados no VS2013, mas infelizmente não está lidando com isso.
Mahdi Alkhatib,
1

Um suplemento do VS que simula comentários aninhados é convertido automaticamente <!--...-->em <!~~...~~>comentários de toda a seção. Ele permite que você ligue e desligue.

comentários aninhados

Paul Gorbas
fonte
0

Acho que não é permitido, mas pelo que sei funciona na maioria dos principais navegadores, exceto no Firefox.

TheHippo
fonte
0

tente usar isso

<!-- 

este é o começo do comentário

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

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

--> fim dos comentários.

drw
fonte
0

Tente isto

<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>
txavier
fonte
1
Você pode explicar? Eu não conhecia uma <comment>palavra - chave em HTML
Mawg diz reintegrar Monica em