Sono possibili commenti HTML nidificati?


96

come da titolo; è possibile avere commenti nidificati in HTML valido? guarda l'esempio sotto ...

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

Sembra di no, qualcuno sa come posso far funzionare i commenti annidati?


4
... oppure non credo sia possibile ma forse qualcuno con più esperienza di me lo saprà!
QAZ

In caso di dubbi su ciò che è valido in HTML, di solito passo al chase & go stringht agli standard ragazzi. In particolare, il W3C Markup Validation Service su validator.w3.org
Mawg dice reinstate Monica

Risposte:


103

Quando annidate un commento, sostituite "-" con "- -". Quando annidate, invertite la procedura. Non è quello <!--che è proibito ma il --.

Esempio:

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

4
Questo significa che il commento interno non è più un commento corretto?
S.Lott

10
Sì, HTML e XML non consentono di annidare commenti utilizzando <! -. Quello che puoi fare nel tuo codice è definire un elemento di commento e ignorarlo attivamente durante l'analisi.
Aaron Digulla

1
nota che dovresti sostituire --con - - per il commento interno (annidato) .
ebosi

3
Se si modifica "-" in "- -", non è più un commento. Non è una soluzione ma un modo per aggirare, puoi anche usare "<% - your comment -%> per aggirare il
problema

Come è stata votata e accettata come migliore risposta? Non funziona nemmeno! Geesh. Si prega di leggere la spiegazione di Dave Land di seguito.
John E,

97

TL; DR : Purtroppo no, non è possibile (e non lo sarà mai).

Risposta breve:

Un commento HTML non è esattamente quello che molti pensano che sia. HTML è una forma di SGML, in cui i commenti sono delimitati da coppie di doppi trattini ( --...  --).

Pertanto, qualsiasi coppia di doppi trattini all'interno di una coppia di parentesi angolari con un punto esclamativo dopo la parentesi di apertura ( <! ---- >) è un commento. Le specifiche lo dicono meglio di me: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

Questo è il motivo per cui i commenti come questo (che abbiamo tutti probabilmente fatto una volta o l'altra) sono una cattiva idea:

<! - ------------------ L'INTESTAZIONE INIZIA QUI -------------------- ->

Verità: sono troppo pigro per dirti quanti commenti sono rappresentati dall'inquinamento del tag sopra, ma è almeno 10.

Sono diventato meno pigro: questo cosiddetto "commento" consiste in realtà di 10 commenti, tre parole al di fuori di ogni commento (cioè, solo un cattivo SGML), e l'inizio di un commento che non è terminato. È un vero casino:

<!--1 ----2 ----3 ----4 ----5--
L'INTESTAZIONE INIZIA QUI
--6 ----7 ----8 ----9 ----10-- -->

Naturalmente, non è così semplice, a causa delle differenze nel modo in cui ciascun browser sceglie di interpretare le specifiche.

Ecco un ottimo articolo che lo spiega:

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

Risposta lunga: perché ci sbagliamo

La maggior parte di noi che è cresciuta con l'HTML (senza approfondire l'SGML che ne è alla base)) è arrivata a credere che la stringa <!--inizi un commento e che la stringa termini -->un commento.

In realtà, <!e >delimita una dichiarazione SGML all'interno del tuo documento HTML, come la dichiarazione DOCTYPE che abbiamo visto tutti all'inizio delle nostre pagine. All'interno di una dichiarazione SGML, i commenti sono delimitati da doppi trattini. Pertanto, il commento HTML

<! - questo è un commento ->

che la maggior parte di noi avrebbe creduto viene analizzato come questo <!-- this is a comment -->è in realtà analizzato in questo modo:
<!-- this is a comment -->. È una dichiarazione SGML che è vuota tranne che per un commento.

Poiché HTML è una forma di SGML, questo "commento all'interno di una-dichiarazione" funziona come un commento HTML.

Per interesse, ecco un pezzo di SGML puro che mostra i commenti che funzionano come erano intesi in SGML: questa definizione di elenco di attributi contiene un commento su ogni riga:

<! ATTLIST LINK
  % attrs; -% coreattrs,% i18n,% events -
  charset% Charset; #IMPLIED - codifica dei caratteri della risorsa collegata -
  href% URI; #IMPLIED - URI per la risorsa collegata -
  hreflang% LanguageCode; #IMPLIED - codice lingua -
  tipo% ContentType; #IMPLIED - tipo di contenuto dell'avviso -
  rel% LinkTypes; #IMPLIED - tipi di collegamento in avanti -
  rev% LinkTypes; #IMPLIED - tipi di collegamento inverso -
  media% MediaDesc; #IMPLIED - per il rendering su questi media -
>

1
Interessante. Mi chiedo se questo sia ancora vero per l'analisi html5.
Kzqai

1
Sfortunatamente, sì, è ancora vero, perché fa parte delle basi SGML sottostanti su cui si basa tutto l'HTML, incluso l'HTML5. È quasi impossibile che questo cambi.
Dave Land,

8

Non si può fare. -->terminerà sempre un commento HTML esistente.


4
Altri linguaggi di programmazione come LUA lo consentono. == [[e == [1 [sono l'inizio di due blocchi di commenti separati. Non vedo motivo per cui un giorno HTML non possa fare la stessa cosa.
john ktejik

7

Se sei davvero bloccato con un pezzo di HTML - pre-renderizzato da una fonte incontrollabile - che contiene commenti e devi assicurarti che nessuno di essi sia visualizzato sulla tua pagina, puoi sempre racchiuderlo con un scripttag come di seguito, l'unica cosa è che non puoi commentare i scripttag in questo modo.

<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 hai bisogno di commentare i scripttag, potresti invece usare un textareawrapper, ovviamente in questo modo, non puoi commentare i textareatag.

<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
Intelligente! Ma cosa fare se il codice HTML contiene già tag <script> ...
Willem

3
@Willem, ha aggiornato la risposta con un approccio aggiuntivo che potrebbe funzionare nel tuo scenario ..
Mathijs Flietstra

1
Grazie, è un modo nuovo. Forse potresti anche racchiudere la cosa nei blocchi di commenti di JS:/* */
Willem

7

Usa templatetag. Il modo più veloce per bloccare la visualizzazione di tutti i commenti e altri 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.

L' <template>elemento non può essere semplicemente aggiunto ovunque. Il suo elemento genitore deve essere l' <body>elemento o pochi altri selezionati .
John E,

1

Alcuni editor hanno comandi di commento / rimozione dei commenti che possono gestire automaticamente i commenti esistenti in un blocco di testo. Visual Studio, ad esempio, lo fa quando premi Ctrl + KC e Ctrl + KU.


Sto provando quello che hai detto per Ctrl + KC e Ctrl + KU per i commenti html nidificati in VS2013, ma sfortunatamente non lo gestisce.
Mahdi Alkhatib

1

Un componente aggiuntivo VS che falsifica i commenti nidificati converte automaticamente <!--...-->in <!~~...~~>commenti e poi l'intera sezione. Ti consente di attivarlo e disattivarlo.

commenti-annidati


0

Penso che non sia consentito, ma per quanto ne so funziona nella maggior parte dei principali browser tranne Firefox.


0

prova a usarlo

<!-- 

questo è l'inizio del commento

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

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

--> fine dei commenti.


0

Prova questo

<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
Puoi spiegare? Non ero a conoscenza di una <comment>parola chiave in HTML
Mawg dice reinstate Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.