Les commentaires HTML imbriqués sont-ils possibles?

96

selon le titre; est-il possible d'avoir des commentaires imbriqués dans du HTML valide? voir l'exemple ci-dessous ...

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

Il semble que non, est-ce que quelqu'un sait comment je pourrais faire fonctionner les commentaires imbriqués?

QAZ
la source
4
... ou je ne pense pas que cela soit possible mais peut-être que quelqu'un avec plus d'expérience que moi le saura!
QAZ
En cas de doute sur ce qui est valide en HTML, je vais généralement droit au but et je vais aux normes. Plus précisément, le service de validation de balisage du W3C à validator.w3.org
Mawg dit de réintégrer Monica

Réponses:

103

Lorsque vous imbriquez un commentaire, remplacez "-" par "- -". Lorsque vous désinstallez, inversez la procédure. Ce n'est pas le <!--qui est interdit mais le --.

Exemple:

<!-- some stuff
<!- - some inner stuff - ->
<!- - a sibling - ->
the footer -->
Aaron Digulla
la source
4
Cela signifie-t-il que le commentaire intérieur n'est plus un commentaire approprié?
S.Lott
10
Oui, HTML et XML ne permettent pas d'imbriquer des commentaires en utilisant <! -. Ce que vous pouvez faire dans votre propre code est de définir un élément de commentaire et de l'ignorer activement lors de l'analyse.
Aaron Digulla le
1
notez que vous devez remplacer --par - - pour le commentaire interne (imbriqué) .
ebosi
3
Si vous remplacez "-" par "- -", ce n'est plus un commentaire. Ce n'est pas une solution mais un moyen de contourner, vous pouvez également utiliser "<% - your comment -%> pour contourner le problème.
Anant Singh
Comment cette réponse a-t-elle été votée et acceptée comme meilleure réponse? Ça ne marche même pas! Geesh. Veuillez lire l'explication de Dave Land ci-dessous.
John E
97

TL; DR : Malheureusement, non, ce n'est pas possible (et ne le sera jamais).

Réponse courte:

Un commentaire HTML n'est pas tout à fait ce que beaucoup pensent que c'est. HTML est une forme de SGML, dans laquelle les commentaires sont délimités par des paires de doubles tirets ( --…  --).

Ainsi, toute paire de doubles tirets à l'intérieur d'une paire de crochets angulaires avec un point d'exclamation après le crochet ouvrant ( <! ---- >) est un commentaire. La spécification le dit mieux que moi: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

C'est pourquoi des commentaires comme celui-ci (que nous avons tous probablement fait une fois ou une autre) sont une mauvaise idée:

<! - ------------------ EN-TÊTE COMMENCE ICI -------------------- ->

Vérité: je suis trop paresseux pour vous dire combien de commentaires sont représentés par la pollution des balises ci-dessus, mais c'est au moins 10.

Je suis devenu moins paresseux: ce soi-disant "commentaire" se compose en fait de 10 commentaires, trois mots en dehors de tout commentaire (c'est-à-dire, juste un mauvais SGML) et le début d'un commentaire qui n'est pas terminé. C'est un vrai bordel:

<!--1 ----2 ----3 ----4 ----5--
EN-TÊTE COMMENCE ICI
--6 ----7 ----8 ----9 ----10-- -->

Bien sûr, ce n'est pas tout à fait aussi simple que cela, en raison des différences dans la façon dont chacun choisit navigateur pour interpréter les spécifications.

Voici un excellent article qui l'explique:

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

Réponse longue: pourquoi nous nous trompons

La plupart d'entre nous qui avons grandi avec HTML (sans fouiller dans le SGML qui le sous-tend)) en sont venus à croire que la chaîne <!--commence un commentaire et la chaîne -->se termine un commentaire.

En fait, <!et >délimitez une déclaration SGML dans votre document HTML, comme la déclaration DOCTYPE que nous avons tous vue en haut de nos pages. Dans une déclaration SGML, les commentaires sont délimités par des doubles tirets. Ainsi, le commentaire HTML

<! - ceci est un commentaire ->

dont la plupart d' entre nous croiraient est analysé comme celui - ci <!-- this is a comment -->est en fait analysé comme ceci:
<!-- this is a comment -->. C'est une déclaration SGML qui est vide à l'exception d'un commentaire.

Le HTML étant une forme de SGML, ce «commentaire dans une déclaration» fonctionne comme un commentaire HTML.

Par intérêt, voici un morceau de SGML pur qui montre les commentaires fonctionnant comme prévu dans SGML: cette définition de liste d'attributs contient un commentaire sur chaque ligne:

<! LIEN ATTLIST
  % attrs; -% coreattrs,% i18n,% événements -
  charset% Charset; #IMPLIED - encodage char de la ressource liée -
  href% URI; #IMPLIED - URI pour la ressource liée -
  hreflang% LanguageCode; #IMPLIED - code de langue -
  type% ContentType; #IMPLIED - type de contenu consultatif -
  rel% LinkTypes; #IMPLIED - types de lien avant -
  rev% LinkTypes; #IMPLIED - types de lien inverse -
  média% MediaDesc; #IMPLIED - pour le rendu sur ces supports -
>
Dave Land
la source
1
Intéressant. Je me demande si cela est toujours vrai pour l'analyse html5.
Kzqai
1
Malheureusement, oui, c'est toujours vrai, car cela fait partie des fondements SGML sous-jacents sur lesquels tout HTML, y compris HTML5, est basé. Il est pratiquement impossible que cela change.
Dave Land
8

Cela ne peut pas être fait. -->mettra toujours fin à un commentaire HTML existant.

Sergio
la source
4
D'autres langages de programmation comme LUA le permettent. == [[et == [1 [sont le début de deux blocs de commentaires séparés. Je ne vois aucune raison pour laquelle un jour HTML ne pourrait pas faire la même chose.
john ktejik
7

Si vous êtes vraiment coincé avec un morceau de HTML - pré-rendu à une source incontrôlable - qui contient des commentaires, et que vous devez vous assurer que rien n'est rendu sur votre page, vous pouvez toujours l'envelopper avec une scriptbalise comme ci-dessous, la seule chose est que vous ne pouvez pas commenter les scriptbalises de cette façon.

<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 vous avez besoin de commenter des scriptbalises, vous pouvez utiliser un textareacomme wrapper à la place, bien sûr, en procédant de cette façon, vous ne pouvez pas commenter les textareabalises.

<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
la source
1
Intelligent! Mais que faire si le code HTML contient déjà des balises <script> ...
Willem
3
@Willem, a mis à jour la réponse avec une approche supplémentaire qui pourrait fonctionner dans votre scénario.
Mathijs Flietstra
1
Merci, c'est une nouvelle façon. Peut-être pourriez-vous également envelopper la chose dans les blocs de commentaires JS:/* */
Willem
7

Utilisez une templatebalise. Le moyen le plus rapide de bloquer tous les commentaires et autres html de s'afficher.

<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
la source
L' <template>élément ne peut pas être ajouté n'importe où. Son élément parent doit être l' <body>élément ou quelques autres .
John E
1

Certains éditeurs ont des commandes de commentaire / décommentation qui peuvent gérer automatiquement les commentaires existants dans un bloc de texte. Visual Studio, par exemple, fait cela lorsque vous appuyez sur Ctrl + KC et Ctrl + KU.

Dirk Vollmar
la source
J'essaie ce que vous avez dit pour Ctrl + KC et Ctrl + KU pour les commentaires html imbriqués dans VS2013, mais malheureusement, il ne le gère pas.
Mahdi Alkhatib
1

Un complément VS qui simule les commentaires imbriqués se convertit automatiquement <!--...-->en <!~~...~~>commentaires sur toute la section. Il vous permet de l'activer et de le désactiver.

commentaires imbriqués

Paul Gorbas
la source
0

Je pense que ce n'est pas autorisé, mais pour autant que je sache, cela fonctionne dans la plupart des principaux navigateurs, sauf dans Firefox.

TheHippo
la source
0

essayez d'utiliser ceci

<!-- 

c'est le début du commentaire

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

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

--> fin des commentaires.

drw
la source
0

Essaye ça

<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
la source
1
Peux-tu expliquer? Je n'étais pas au courant d'un <comment>mot clé en HTML
Mawg dit de rétablir Monica