Возможны ли вложенные комментарии HTML?


97

согласно названию; возможно ли иметь вложенные комментарии в действительном HTML? см. пример ниже ...

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

Кажется, нет, кто-нибудь знает, как я могу заставить работать вложенные комментарии?


4
... или я не думаю, что это возможно, но, возможно, кто-то с большим опытом, чем я, узнает!
QAZ

Если я сомневаюсь в том, что является допустимым в HTML, я обычно перехожу к делу и следую стандартам. В частности, W3C Markup Validation Service на validator.w3.org
Mawg говорит Моника восстановило

Ответы:


105

При вложении комментария замените «-» на «- -». Когда вы откладываете, повторите процедуру в обратном порядке. Не то, <!--что запрещено, а то --.

Пример:

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

4
Означает ли это, что внутренний комментарий больше не является правильным комментарием?
S.Lott

10
Да, HTML и XML не позволяют вкладывать комментарии с помощью <! -. Что вы можете сделать в своем собственном коде, так это определить элемент комментария и активно игнорировать его во время синтаксического анализа.
Аарон Дигулла,

1
обратите внимание , что вы должны заменить --с - - на внутренний (гнездовой) комментарий .
ebosi

3
Если вы измените «-» на «- -», это больше не будет комментарием. Это не решение, а способ решения проблемы, вы также можете использовать "<% - your comment -%>" для решения проблемы.
Анант Сингх

Как этот ответ был одобрен и принят как лучший ответ? Это даже не работает! Боже. Пожалуйста, прочтите объяснение Дэйва Лэнда ниже.
John E

99

TL; DR : К сожалению, нет, это невозможно (и никогда не будет).

Короткий ответ:

Комментарий HTML - это не совсем то, что многие думают. HTML - это форма SGML, в которой комментарии разделены парами двойных тире ( --… -- ).

Таким образом, любая пара двойных тире внутри пары угловых скобок с восклицательным знаком после открывающей скобки ( <! ---- >) является комментарием. В спецификации сказано лучше, чем я могу: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

Вот почему подобные комментарии (которые мы все, вероятно, когда-то делали) - плохая идея:

<! - ------------------ ЗАГОЛОВОК НАЧИНАЕТСЯ ЗДЕСЬ -------------------- ->

Правда: мне лень говорить вам, сколько комментариев представлено вышеупомянутым загрязнением тега, но это не менее 10.

Я стал менее ленивым: этот так называемый «комментарий» на самом деле состоит из 10 комментариев, трех слов вне любого комментария (то есть просто плохого SGML) и начала комментария, которое не заканчивается. Это настоящий беспорядок:

<!--1 ----2 ----3 ----4 ----5--
ЗАГОЛОВОК НАЧИНАЕТСЯ ЗДЕСЬ
--6 ----7 ----8 ----9 ----10-- -->

Конечно, это не так просто из-за различий в том, как каждый браузер интерпретирует спецификацию.

Вот отличная статья, в которой это объясняется:

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

Длинный ответ: почему мы ошибаемся

Большинство из нас, кто вырос на HTML (не углубляясь в SGML, лежащий в его основе)), пришли к выводу, что строка <!--начинается с комментария, а строка -->заканчивается комментарием.

Собственно, <!и >разделите объявление SGML в вашем HTML-документе, например, объявление DOCTYPE, которое мы все видели в верхней части наших страниц. В объявлении SGML комментарии разделяются двойным тире. Таким образом, комментарий HTML

<! - это комментарий ->

который большинство из нас считают , анализируется , как это <!-- this is a comment -->на самом деле разбирается , как это:
<!-- this is a comment -->. Это объявление SGML, которое пусто, за исключением комментария.

Поскольку HTML является формой SGML, этот «комментарий в объявлении» функционирует как комментарий HTML.

Ради интереса, вот кусок чистого SGML, который показывает, что комментарии функционируют так, как они были задуманы в SGML: это определение списка атрибутов содержит комментарий к каждой строке:

<! ССЫЛКА НА АТТЛИСТ
  % attrs; -% coreattrs,% i18n,% событий -
  charset% Charset; # ПРЕДПОЛАГАЕТСЯ - символьная кодировка связанного ресурса -
  href% URI; # ПРЕДПОЛАГАЕТСЯ - URI для связанного ресурса -
  hreflang% LanguageCode; # ПРЕДПОЛАГАЕТСЯ - код языка -
  type% ContentType; # ПРЕДПОЛАГАЕТСЯ - тип информационного содержания -
  rel% LinkTypes; # ПРЕДПОЛАГАЕТСЯ - типы прямых ссылок -
  rev% LinkTypes; # ПРЕДПОЛАГАЕТСЯ - типы обратных ссылок -
  media% MediaDesc; # ПРЕДПОЛАГАЕТСЯ - для рендеринга на этих носителях -
>

1
Интересно. Интересно, верно ли это в отношении синтаксического анализа html5.
Kzqai

1
К сожалению, да, это все еще верно, потому что это часть базовой основы SGML, на которой основан весь HTML, включая HTML5. Это практически невозможно изменить.
Дэйв Лэнд

8

Это невозможно. -->всегда будет заканчивать существующий комментарий HTML.


4
Другие языки программирования, такие как LUA, позволяют это. == [[и == [1 [- начало двух отдельных блоков комментариев. Я не вижу причин, по которым когда-нибудь HTML не смог бы сделать то же самое.
john ktejik 07

7

Если вы действительно застряли в каком-то фрагменте HTML, предварительно обработанном в неконтролируемом источнике, который содержит комментарии, и вам нужно убедиться, что ни один из них не отображается на вашей странице, вы всегда можете обернуть его scriptтегом, как показано ниже, Единственное, вы не можете так закомментировать scriptтеги.

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

Если вам нужно закомментировать scriptтеги, вы можете textareaвместо этого использовать в качестве оболочки, конечно, делая это таким образом, вы не можете закомментировать textareaтеги.

<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
Умная! Но что делать, если HTML-код уже содержит теги <script> ...
Виллем

3
@Willem, обновил ответ дополнительным подходом, который может сработать в вашем сценарии ..
Mathijs Flietstra

1
Спасибо, это новый способ. Возможно, вы также могли бы обернуть эту вещь в блоки комментариев JS:/* */
Виллем

7

Используйте templateтег. Самый быстрый способ заблокировать отображение всех комментариев и других 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>Элемент не может просто быть добавлены в любом месте. Его родительским элементом должен быть либо <body>элемент, либо несколько других .
John E

1

В некоторых редакторах есть команды комментирования / раскомментирования, которые могут автоматически обрабатывать существующие комментарии в блоке текста. Visual Studio, например, делает это, когда вы нажимаете Ctrl + KC и Ctrl + KU.


Я пытаюсь то, что вы сказали для Ctrl + KC и Ctrl + KU для вложенных комментариев html в VS2013, но, к сожалению, он не обрабатывает его.
Махди Алхатиб

1

Надстройка VS, которая имитирует вложенные комментарии, автоматически преобразуется <!--...-->в <!~~...~~>комментарии, а затем комментирует весь этот раздел. Это позволяет вам включать и выключать его.

вложенные комментарии


0

Я думаю, что это запрещено, но, насколько я знаю, это работает в большинстве основных браузеров, кроме Firefox.


0

попробуйте использовать это

<!-- 

это начало комментария

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

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

--> конец комментариев.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.