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

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

Ответы

Ответ 1

Написание DOCTYPE - это, безусловно, лучшая практика.

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

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

Ответ 2

полностью

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

Однако он приносит все версии IE в quirks-mode (если только он не принудительно переходит в режим отсутствия quirks - см. Gotchas ниже). Самый простой способ - переместить комментарий ниже DOCTYPE.

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

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

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

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

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

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

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

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

Gotchas

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

<![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, могут быть принудительно использованы в стандартном режиме (и в режиме quirks-mode) с использованием другого изобретения Microsoft - директивы x-ua-compatible. См. 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 в режиме без quirks, тогда как IE6 и IE7 будут оставаться в режиме quirks. В то время как, напротив, этот

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

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

Ответ 4

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

Ответ 5

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