Могут ли комментарии появиться до объявления 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 и ниже.