Могут ли комментарии появиться до объявления DOCTYPE?

Я хотел бы разместить комментарий (<!-- this --> style) в самом верху моего HTML-кода, предшествующего объявлению DOCTYPE. Соответствует ли это стандартам? Поддерживается ли это основными браузерами? Есть ли подводные камни в этом?

5 ответов

Решение

Написание <!DOCTYPE> Во-первых, это лучшая практика.

Я помню странные проблемы давным-давно, когда какой-то браузер (вероятно, IE6) игнорировал <!DOCTYPE> потому что до этого было что-то, казалось бы, невинное - я думаю, просто пробел, но, возможно, это был комментарий. В любом случае, это была ужасная, ужасная ошибка, которую нужно было отследить, и, безусловно, никогда не было веской причины оставлять комментарии или пробелы до <!DOCTYPE>,

Написание <!DOCTYPE> Во-первых, я бы сказал, что опытные веб-разработчики пытаются избежать ужасных, неуловимых ошибок.

Это полностью допустимо делать

<!-- this, -->
<!DOCTYPE html>

Тем не менее, он переводит все версии IE в режим quirks (если только он не переведен в режим no-quirks - см. Раздел Gotchas ниже). Самое простое - переместить комментарий под DOCTYPE.

<!DOCTYPE html>
<!-- this, -->

Но другой способ - "обновить" комментарий до подходящего условного комментария, такого как этот:

<!--[if !IE]> this <![endif]-->
<!DOCTYPE html>

Объяснение: условный комментарий не считается комментарием в мире IE.

Альтернативный синтаксис: чтобы забыть / запомнить, что условные комментарии являются вторжением Microsoft в стандарт HTML, можно, например, сделать

<!--[if anybrowser]> this <![endif]-->
<!DOCTYPE html>

Аналогично, для целевой IE, в частности, можно сделать

<!--[if !anybrowser]> this <![endif]-->
<!DOCTYPE html>

Gotchas

Комментарий внутри условного комментария переведет IE в режим quirks, если IE его видит (то есть: если используется условие [if IE] или эквивалент [if IE] - такой как условие [if! Anybrowser], которое Я упоминал выше.). Так, например, это приведет IE в режим quirks:

<![if IE]><!-- this --><![endif]>
<!DOCTYPE html>

Как бы

<!--[if IE]><!--><!-- this <![endif]-->
<!DOCTYPE html>

и много других вариантов. Тогда как, например,

<!--[if IE]><!DOCTYPE html><!--><!-- this <![endif]-->
<!DOCTYPE html>

не вызовет quirks-mode, потому что здесь условный комментарий имеет DOCTYPE перед любым другим контентом, и, следовательно, IE считает, что первым контентом страницы является DOCTYPE.

Наконец, новейшие версии IE, IE8 и IE9, могут быть переведены в стандартный режим (и также в странный режим) с помощью другого изобретения Microsoft - директивы, совместимой с x-ua. См. http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx В этом случае, затем

<!-- this -->
<!DOCTYPE html>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=8" ><![endif]-->

переведет IE8 и IE9 в режим без причуд, а IE6 и IE7 останутся в режиме причуд. В то время как, напротив, это

<!--[if gte IE 8]><meta http-equiv="X-UA-Compatible" content="IE=8" ><![endif]-->
<!DOCTYPE html>

приведет к тому, что IE8 и IE9 перейдут в режим стандартов, несмотря на то, что содержание условного комментария не начинается с DOCTYPE. И IE6, и IE7 также останутся в режиме без причуд, так как условный комментарий не нацелен на них.

Хотя это приемлемо в соответствии со стандартом, я полагаю, вы определенно хотите избежать этого, так как это переведет IE в режим причуд.

(См. Запуск различных режимов рендеринга)

Это может привести к тому, что IE7 будет отображаться в режиме причуд, как если бы doctype вообще не существовал, согласно этой странице.

Комментарии до типа документа разрешены, но все версии IE возвращаются в режим совместимости. Они, на самом деле, иногда используются для этой цели. Декларация XML (<?xml version ...?>) имеют такой же эффект, как в IE6 и ниже.

Другие вопросы по тегам