Czy możliwe są zagnieżdżone komentarze HTML?


97

zgodnie z tytułem; czy można mieć zagnieżdżone komentarze w prawidłowym HTML? zobacz poniższy przykład ...

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

Wydaje się, że nie, czy ktoś wie, jak mogę sprawić, by zagnieżdżone komentarze działały?


4
... albo nie sądzę, żeby to było możliwe, ale może ktoś z większym doświadczeniem niż ja będzie wiedział!
QAZ

Jeśli masz wątpliwości co do tego, co jest poprawne w HTML, zwykle przechodzę do sedna i podążam za facetami od standardów. W szczególności usługa W3C Markup Validation Service pod adresem validator.w3.org
Mawg mówi, że przywróć Monikę

Odpowiedzi:


105

Kiedy zagnieżdżasz komentarz, zamień „-” na „- -”. Kiedy usuwasz zagnieżdżenie, odwróć procedurę. To nie jest to, <!--co jest zabronione, ale --.

Przykład:

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

4
Czy to oznacza, że ​​komentarz wewnętrzny nie jest już właściwym komentarzem?
S.Lott,

10
Tak, HTML i XML nie pozwalają na zagnieżdżanie komentarzy za pomocą <! -. To, co możesz zrobić we własnym kodzie, to zdefiniować element komentarza i aktywnie go ignorować podczas analizowania.
Aaron Digulla

1
Należy pamiętać, że należy wymienić --z - - na wewnętrznej (zagnieżdżone) komentarzu .
ebosi

3
Jeśli zmienisz „-” na „- -”, nie będzie to już komentarz. To nie jest rozwiązanie, ale sposób na obejście, możesz również użyć „<% - your comment -%>”, aby się obejść.
Anant Singh

W jaki sposób zostało to przyjęte i uznane za najlepszą odpowiedź? To nawet nie działa! Geesh. Przeczytaj wyjaśnienie Dave Land'a poniżej.
John E

98

TL; DR : Niestety nie, nie jest to możliwe (i nigdy nie będzie).

Krótka odpowiedź:

Komentarz HTML nie jest tym, za co wielu się uważa. HTML to forma SGML, w której komentarze są rozdzielane parami podwójnych myślników (-- …  --).

Zatem każda para podwójnych kresek wewnątrz pary nawiasów ostrych z wykrzyknikiem po nawiasie otwierającym ( <! ---- > ) jest komentarzem. Specyfikacja mówi to lepiej niż ja: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

Właśnie dlatego komentarze takie jak ten (które wszyscy prawdopodobnie robiliśmy co jakiś czas) są złe pomysł:

<! - ------------------ NAGŁÓWEK ZACZYNA SIĘ TUTAJ -------------------- ->

Prawda: jestem zbyt leniwy, aby powiedzieć, ile komentarzy jest reprezentowanych przez powyższe zanieczyszczenie tagami, ale jest to co najmniej 10.

Zrobiłem się mniej leniwy: tak zwany „komentarz” w rzeczywistości składa się z 10 komentarzy, trzech słów poza jakimkolwiek komentarzem (tj. Po prostu zły SGML) i początku komentarza, który nie został zakończony. To prawdziwy bałagan:

<!--1 ----2 ----3 ----4---- 5--
NAGŁÓWEK ZACZYNA SIĘ TUTAJ
--6 ----7 ----8 ----9 ----10-- -->

Oczywiście nie do końca to takie proste ze względu na różnice w sposobie interpretowania specyfikacji przez każdą przeglądarkę.

Oto doskonały artykuł, który to wyjaśnia:

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

Długa odpowiedź: dlaczego się mylimy

Większość z nas, którzy dorastali w HTML (bez zagłębiania się w SGML, który jest jego podstawą)), doszła do wniosku, że ciąg <!-- rozpoczyna komentarz, a ciąg -->kończy komentarz.

Właściwie <!i >ogranicz deklarację SGML w dokumencie HTML, taką jak deklaracja DOCTYPE, którą wszyscy widzieliśmy na górze naszych stron. W ciągu deklaracji SGML komentarze są rozdzielane podwójnymi myślnikami. Tak więc komentarz HTML

<! - to jest komentarz ->

który większość z nas uważa, że ​​jest analizowany w ten sposób, <!-- this is a comment -->jest analizowany w ten sposób:
<!-- this is a comment --> . Jest to deklaracja SGML, która jest pusta z wyjątkiem komentarza.

Ponieważ HTML jest formą SGML, ten „komentarz w deklaracji” funkcjonuje jako komentarz HTML.

Z ciekawości, oto fragment czystego SGML, który pokazuje komentarze działające tak, jak były zamierzone w SGML: ta definicja listy atrybutów zawiera komentarz do każdej linii:

<! ATTLIST LINK
  % atrs; -% coreattrs,% i18n,% events -
  charset% Charset; #IMPLIED - kodowanie znaków połączonego zasobu -
  href% URI; #IMPLIED - URI dla połączonego zasobu -
  hreflang% LanguageCode; #IMPLIED - kod języka -
  typ% ContentType; #IMPLIED - doradczy typ treści -
  rel% LinkTypes; #IMPLIED - typy linków do przodu -
  rev% LinkTypes; #IMPLIED - typy linków zwrotnych -
  media% MediaDesc; #IMPLIED - do renderowania na tych mediach -
>

1
Ciekawy. Zastanawiam się, czy nadal tak jest w przypadku parsowania html5.
Kzqai

1
Niestety, tak, nadal jest to prawdą, ponieważ jest to część podstawowych podstaw SGML, na których oparty jest cały HTML, w tym HTML5. Zmiana tego stanu rzeczy jest prawie niemożliwa.
Dave Land

8

Nie da się tego zrobić. -->zawsze zakończy istniejący komentarz HTML.


4
Inne języki programowania, takie jak LUA, pozwalają na to. == [[i == [1 [] to początek dwóch oddzielnych bloków komentarzy. Nie widzę powodu, dla którego kiedyś HTML nie mógł zrobić tego samego.
john ktejik

7

Jeśli naprawdę utkniesz z jakimś fragmentem HTML - wstępnie wyrenderowanym w jakimś niekontrolowanym źródle - który zawiera komentarze i musisz upewnić się, że żaden z nich nie jest renderowany na twojej stronie, zawsze możesz owinąć go scripttagiem jak poniżej, chodzi tylko o to, że w scriptten sposób nie można komentować tagów.

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

Jeśli chcesz zakomentować scripttagi, możesz textareazamiast tego użyć opakowania as, oczywiście robiąc to w ten sposób, nie możesz komentować textareatagów.

<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
Sprytny! Ale co zrobić, jeśli kod HTML zawiera już tagi <script> ...
Willem

3
@Willem, zaktualizował odpowiedź o dodatkowe podejście, które może działać w twoim scenariuszu.
Mathijs Flietstra

1
Dzięki, to nowatorski sposób. Być może mógłbyś również opakować to w bloki komentarzy JS:/* */
Willem

7

Użyj templatetagu. Najszybszy sposób na zablokowanie wyświetlania wszystkich komentarzy i innych treści 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>Element nie może być po prostu dodany w dowolnym miejscu. Jego elementem nadrzędnym musi być <body>element lub kilka innych wybranych .
John E

1

Niektórzy redaktorzy mają polecenia komentowania / usuwania komentarzy, które mogą automatycznie obsługiwać istniejące komentarze w bloku tekstu. Visual Studio np. Robi to po naciśnięciu Ctrl + KC i Ctrl + KU.


Próbuję tego, co powiedziałeś dla Ctrl + KC i Ctrl + KU dla zagnieżdżonych komentarzy html w VS2013, ale niestety to nie obsługuje.
Mahdi Alkhatib

1

Dodatek VS, który fałszuje zagnieżdżone komentarze, automatycznie konwertując <!--...-->do<!~~...~~> następnie komentuje, że całej sekcji. Pozwala to włączać i wyłączać.

komentarze zagnieżdżone


0

Myślę, że nie jest to dozwolone, ale o ile wiem, działa w większości głównych przeglądarek z wyjątkiem Firefoksa.


0

spróbuj tego użyć

<!-- 

to jest początek komentarza

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

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

--> koniec komentarzy.


0

Spróbuj tego

<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
Możesz wytłumaczyć? Nie znałem <comment>słowa kluczowego w HTML
Mawg mówi, że przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.