Изменяет ли HTML5 стандарт комментирования HTML?

131

Недавно я обнаружил, что, возможно, есть новый способ комментирования в HTML5.

Вместо типичного <!-- -->многострочного комментария, о котором я читал, мне показалось , что я заметил, что моя IDE регулярно <!div >закомментировала. Я протестировал его, и, к моему удивлению, Chrome закомментировал этот тег. Он только закомментировал тег , а не содержимое DIV, так что мне пришлось закомментировать ближе , <!/div>чтобы избежать закрытия других дивы.

Я протестировал другой, и выяснилось, что обычно установка восклицательного знака перед открытием любого тега, этот символ <, делает этот тег закомментированным.

Это действительно ново? Это плохая практика? На самом деле это очень удобно, но практично ли (если не ново)?

Отредактируйте дополнительные сведения: хотя синтаксическая ошибка или неправильное толкование этого синтаксиса является веской причиной, почему Chrome фактически отображает их как полные комментарии?

Код записывается как :

<!div displayed> some text here that is still displayed <!/div>

И тогда это отображается как :

<!--div displayed--> some text here that is still displayed <!--/div-->
Андрей
источник
19
Скорее всего, это просто синтаксическая ошибка и / или бессмысленный тег, который игнорируется.
deceze
@deceze Я отчасти ожидал этого, поскольку браузеры могут быть снисходительны к тому, как они отображают html в соответствии с менее строгими правилами.
Эндрю
1
@ Lemony-Andrew Что такое IDE? В соответствии с выбранным ответом мы можем сообщить об этом как о проблеме (или исправить ее, если исходный код открыт).
Дерексон
1
@Derecksonit Я дважды проверил свою IDE после того, как был дан официальный ответ, чтобы убедиться, что мои глаза не обманывают меня. Оказалось, что он не был фактически закомментирован, а был обычным цветом текста, который был похож. Все это было случайно.
Эндрю

Ответы:

196

В HTML5 нет нового стандарта для комментариев. Единственный допустимый синтаксис комментария по-прежнему <!-- -->. Из раздела 8.1.6 W3C HTML5 :

Комментарии должны начинаться с четырехсимвольной последовательности U + 003C МЕНЬШЕ ЗНАКА, U + 0021 Восклицательный знак, U + 002D ДЕФИС-МИНУС, U + 002D ДЕФИС-МИНУС ( <!--).

В <!синтаксических берет начало в SGML DTD разметки, которая не является частью HTML5. В HTML5 он зарезервирован для комментариев, разделов CDATA и объявления DOCTYPE. Поэтому, является ли эта альтернатива плохой практикой, зависит от того, считаете ли вы использование (или, что еще хуже, зависимость от) устаревшей разметки плохой практикой.

Validator.nu называет то, что у вас есть «Поддельный комментарий». - это означает, что он рассматривается как комментарий, даже если это недействительный комментарий. Предположительно это сделано для обратной совместимости с pre-HTML5, который был основан на SGML и имел декларации разметки, принимавшие форму <!FOO>, поэтому я бы не стал называть это новым. Причина они рассматриваются как комментарии, потому что декларации SGML разметки , были специальные заявления не должны быть вынесено, но так как они не имеют смысла в HTML5 (с указанными выше исключениями), насколько HTML5 DOM обеспокоен они не являются не более , чем комментарии ,

Следующие шаги в разделе 8.2.4 приводят к такому выводу, которому Chrome, похоже, следует в точности:

  1. 8.2.4.1 Состояние данных :

    Использовать следующий вводимый символ:

    «<» (U + 003C)
    Перейти в состояние открытия тега.

  2. 8.2.4.8 Открытое состояние тега :

    Использовать следующий вводимый символ:

    "!" (U + 0021)
    Перейти в открытое состояние объявления разметки.

  3. 8.2.4.45 Открытое состояние объявления разметки :

    Если следующие два символа являются символами «-» (U + 002D), используйте эти два символа, создайте токен комментария, данные которого являются пустой строкой, и переключитесь в состояние начала комментария.

    В противном случае, если следующие семь символов являются совпадением без учета регистра в кодировке ASCII для слова «DOCTYPE», используйте эти символы и переключитесь в состояние DOCTYPE.

    В противном случае, если есть скорректированный текущий узел и он не является элементом в пространстве имен HTML, а следующие семь символов являются совпадением с учетом регистра для строки «[CDATA [» (пять заглавных букв «CDATA» с U + 005B ЛЕВЫЙ КВАДРАТНЫЙ символ до и после), затем используйте эти символы и переключитесь в состояние раздела CDATA.

    В противном случае это ошибка синтаксического анализа. Перейти в состояние фиктивного комментария. Следующий потребляемый символ, если таковой имеется, является первым символом, который будет в комментарии.

    Обратите внимание, что в нем говорится о переключении в состояние начала комментария только в том случае, если последовательность встречающихся символов равна <!--, иначе это фиктивный комментарий. Это отражает то, что указано в разделе 8.1.6 выше.

  4. 8.2.4.44 Состояние фиктивного комментария :

    Использовать все символы до первого символа «>» (U + 003E) или конца файла (EOF) включительно, в зависимости от того, что наступит раньше. Выдать токен комментария, данные которого представляют собой конкатенацию всех символов, начиная с символа, который заставил конечный автомат переключиться в состояние фиктивного комментария, вплоть до символа непосредственно перед последним использованным символом (т. Е. До символа непосредственно перед символом U + 003E или EOF), но с любыми символами U + 0000 NULL, замененными на символы U + FFFD REPLACEMENT CHARACTER. (Если комментарий был начат в конце файла (EOF), токен пуст. Точно так же токен пуст, если он был сгенерирован строкой " <!>".)

    Говоря простым языком, это превращается <!div displayed>в <!--div displayed-->и <!/div>в <!--/div-->точно так, как описано в вопросе.

В заключение, вы, вероятно, можете ожидать, что другие парсеры, совместимые с HTML5, будут вести себя так же, как Chrome.

BoltClock
источник
11
Спасибо, что нашли время, чтобы найти официальную причину этого инцидента. Это немного проясняет ситуацию и придает большую силу моему ошибочному предположению.
Эндрю
2
Странно, что в спецификации HTML5 есть правила для обработки «недействительного» контента. Если он недействителен, его вообще не следует обрабатывать.
Артуро Торрес Санчес
2
Вот каким раньше были HTML и веб-языки - строгие. Причина, по которой неправильная структура кода обрабатывается так снисходительно, - это сайты лучшего качества. Чем больше веб-сайтов может просматривать браузер и правильно просматривать с неправильным синтаксисом, тем более счастливыми будут их конечные пользователи. Авторы общих веб-стандартов (в основном w3, а не другой) поняли, что производители браузеров из-за этого не следовали рекомендациям. HTML5 появился и основывался только на идее официально сделать дизайн более мягким.
Эндрю
3
@ ArturoTorresSánchez: XHTML попытался применить подход «недопустимое содержимое = ошибка» и потерпел неудачу. Кроме того, правила в основном гласят: «Не анализируйте этот фиктивный комментарий, просто рассматривайте его как комментарий и анализируйте следующее действительное сообщение, которое вы найдете». Итак, в зависимости от вашей точки зрения, HTML5 либо не делает то, что вы хотите, потому что то, что вы хотите, отстой, либо HTML5 делает именно то, что вы хотите.
slebetman
1
@ ArturoTorresSánchez: Исторически сложилось так, что серверы HTML должны были обслуживать одну и ту же последовательность символов в любом браузере; хотя можно разработать формат документа таким образом, чтобы старые парсеры могли различать документы, которые используют «необязательные» новые функции, которые старые парсеры должны игнорировать, документы, которые используют более важные новые функции и должны быть отклонены браузерами, которые не t поддерживать их и документы, которые просто недействительны, такого не было сделано с HTML в годы его становления.
supercat 09
12

Я не думаю, что это хорошая привычка, поскольку это <!означает объявления разметки вроде <!DOCTYPE. Таким образом, вы думаете, что это прокомментировано (ну ... браузер попытается его интерпретировать).

Даже если он не появляется, похоже, это неправильный синтаксис для комментирования HTML-кода.

Ив Ланге
источник
Хотя это может быть правдой, почему Chrome фактически закомментировал эти теги, но теперь doctype.
Эндрю
4
Предложение (я не уверен, просто догадываюсь): пытается интерпретировать> не могу> прокомментировать?
Ив Ланж
Мне это кажется достаточно разумным.
Эндрю
Опять же (извините, что настаиваю), но имейте в виду, что это всего лишь предположение!
Ив Ланж