¿Son posibles los comentarios HTML anidados?


96

según el título; ¿Es posible tener comentarios anidados en HTML válido? vea el ejemplo a continuación ...

<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 no, ¿alguien sabe cómo puedo hacer que funcionen los comentarios anidados?


4
... o no lo creo posible, ¡pero tal vez alguien con más experiencia que yo lo sepa!
QAZ

Si tengo dudas sobre lo que es válido en HTML, por lo general voy al grano y me dirijo a los estándares. Específicamente, el W3C Markup Validation Service en validator.w3.org
Mawg dice reinstalar a Monica el

Respuestas:


103

Cuando anide un comentario, reemplace "-" por "- -". Cuando desanide, invierta el procedimiento. No es el <!--que está prohibido sino el --.

Ejemplo:

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

4
¿Significa esto que el comentario interno ya no es un comentario adecuado?
S.Lott

10
Sí, HTML y XML no permiten anidar comentarios usando <! -. Lo que puede hacer en su propio código es definir un elemento de comentario e ignorarlo activamente durante el análisis.
Aaron Digulla

1
tenga en cuenta que debe reemplazar --con - - para el comentario interno (anidado) .
ebosi

3
Si cambia "-" a "- -", dejará de ser un comentario. No es una solución, sino una forma de evitar, también se puede utilizar "<% - su comentario -%> para un revés.
Anant Singh

¿Cómo se votó a favor y se aceptó como la mejor respuesta? ¡Ni siquiera funciona! Geesh. Lea la explicación de Dave Land a continuación.
John E

97

TL; DR : Desafortunadamente, no, no es posible (y nunca lo será).

Respuesta corta:

Un comentario HTML no es exactamente lo que muchos piensan. HTML es una forma de SGML, en la que los comentarios están delimitados por pares de guiones dobles ( --…  --).

Por lo tanto, cualquier par de guiones dobles dentro de un par de corchetes angulares con un signo de exclamación después del corchete de apertura ( <! ---- >) es un comentario. La especificación lo dice mejor que yo: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

Es por eso que comentarios como este (que probablemente todos hemos hecho alguna vez) son una mala idea:

<! - ------------------ HEADER COMIENZA AQUÍ -------------------- ->

Verdad: Soy demasiado vago para decirles cuántos comentarios están representados por la contaminación de la etiqueta anterior, pero son al menos 10.

Me volví menos perezoso: este llamado "comentario" en realidad consta de 10 comentarios, tres palabras fuera de cualquier comentario (es decir, solo un SGML incorrecto) y el comienzo de un comentario que no termina. Es un verdadero lío:

<!--1 ----2 ----3 ----4 ----5--
HEADER COMIENZA AQUÍ
--6 ----7 ----8 ----9 ----10-- -->

Por supuesto, no es tan simple, debido a las diferencias en cómo cada navegador elige interpretar la especificación.

Aquí hay un excelente artículo que lo explica:

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

Respuesta larga: por qué nos equivocamos

La mayoría de los que crecimos con HTML (sin profundizar en el SGML que lo subyace) hemos llegado a creer que la cadena <!--comienza un comentario y la cadena -->termina un comentario.

De hecho, <!y >delimite una declaración SGML dentro de su documento HTML, como la declaración DOCTYPE que todos hemos visto en la parte superior de nuestras páginas. Dentro de una declaración SGML, los comentarios están delimitados por guiones dobles. Por tanto, el comentario HTML

<! - esto es un comentario ->

lo que la mayoría de nosotros creemos que es analizado sintácticamente como esto <!-- this is a comment -->es en realidad analiza así:
<!-- this is a comment -->. Es una declaración SGML que está vacía excepto por un comentario.

Debido a que HTML es una forma de SGML, este "comentario dentro de una declaración" funciona como un comentario HTML.

Por interés, aquí hay un fragmento de SGML puro que muestra los comentarios funcionando como se pretendía en SGML: esta definición de lista de atributos contiene un comentario en cada línea:

<! ATTLIST LINK
  % attrs; -% coreattrs,% i18n,% eventos -
  charset% Charset; #IMPLIED - codificación de caracteres del recurso vinculado -
  href% URI; #IMPLIED - URI para recurso vinculado -
  hreflang% LanguageCode; #IMPLIED - código de idioma -
  type% ContentType; #IMPLIED - tipo de contenido de aviso -
  rel% LinkTypes; #IMPLIED - tipos de enlaces de reenvío -
  rev% LinkTypes; #IMPLIED - tipos de enlace inverso -
  media% MediaDesc; #IMPLIED - para renderizar en estos medios -
>

1
Interesante. Me pregunto si esto sigue siendo cierto para el análisis html5.
Kzqai

1
Desafortunadamente, sí, sigue siendo cierto, porque es parte de los cimientos SGML subyacentes en los que se basa todo HTML, incluido HTML5. Es casi imposible que esto cambie.
Dave Land

8

No se puede hacer. -->siempre terminará un comentario HTML existente.


4
Otros lenguajes de programación como LUA lo permiten. == [[y == [1 [son el comienzo de dos bloques de comentarios separados. No veo ninguna razón por la que algún día HTML no pueda hacer lo mismo.
john ktejik

7

Si realmente está atascado con algún fragmento de HTML, renderizado previamente en alguna fuente incontrolable, que contiene comentarios, y necesita asegurarse de que no se renderice nada en su página, siempre puede envolverlo con una scriptetiqueta como la siguiente, Lo único es que no puede comentar las scriptetiquetas de esta manera.

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

Si necesita comentar las scriptetiquetas, puede usar un textareacontenedor como en su lugar, por supuesto, al hacerlo de esta manera, no puede comentar las textareaetiquetas.

<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
¡Inteligente! Pero qué hacer si el código HTML ya contiene etiquetas <script> ...
Willem

3
@Willem, actualizó la respuesta con un enfoque adicional que podría funcionar en su escenario ..
Mathijs Flietstra

1
Gracias, es una forma novedosa. Quizás también podría envolver la cosa en bloques de comentarios JS:/* */
Willem

7

Usar templateetiqueta. La forma más rápida de bloquear todos los comentarios y otros html para que no aparezcan.

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

El <template>elemento no se puede agregar en cualquier lugar. Su elemento padre tiene que ser el <body>elemento o unos pocos otros seleccionados .
John E

1

Algunos editores tienen comandos para comentar / descomentar que pueden manejar automáticamente los comentarios existentes en un bloque de texto. Visual Studio, por ejemplo, lo hace cuando presiona Ctrl + KC y Ctrl + KU.


Estoy intentando lo que dijiste para Ctrl + KC & Ctrl + KU para comentarios html anidados en VS2013, pero desafortunadamente no lo está manejando.
Mahdi Alkhatib

1

Un complemento de VS que falsifica comentarios anidados al convertir automáticamente <!--...-->para <!~~...~~>luego comentar toda la sección. Te permite activarlo y desactivarlo.

comentarios-anidados


0

Creo que no está permitido, pero hasta donde yo sé, funciona en la mayoría de los principales navegadores excepto en Firefox.


0

intenta usar esto

<!-- 

este es el comienzo del comentario

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

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

--> fin de los comentarios.


0

Prueba esto

<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
¿Puedes explicar? No conocía una <comment>palabra clave en HTML
Mawg dice restablecer a Monica
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.