т.е. условные комментарии нуждаются в объяснении - PullRequest
6 голосов
/ 09 сентября 2011

Следующий код предназначен для надежного кросс-браузерного определения версии IE

<!--[if lt IE 7 ]><body class="ie_6"><![endif]-->
<!--[if IE 7 ]><body class="ie_7"><![endif]-->
<!--[if IE 8 ]><body class="ie_8"><![endif]-->
<!--[if IE 9 ]><body class="ie_9"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!-->
<body>
<!--<![endif]-->

Я не понимаю, почему он работает. Почему обычный <body> не перезаписывает <body class="ie_9">, поскольку это обычный тег, должен распознаваться всеми браузерами.

Что за магия

    <!-->
    <body>
    <!--

Ответы [ 2 ]

11 голосов
/ 09 сентября 2011

Вы, вероятно, хотите изменить !(IE) на (!IE)

Кроме того, «нормальный» тег <body>, о котором вы говорите, находится в условном комментарии. Тот факт, что он находится в другой строке, не имеет значения, он все еще находится внутри тега условного комментария, поэтому на него влияют как таковые.

Условные комментарии для IE работают с использованием обычных HTML-комментариев <!-- -->, поэтому любой код внутри «ложного» условия просто закомментирован; <!-- <body class="ie6"> --> IE тогда имеет собственный синтаксис внутри этого. Таким образом, браузеры без IE просто видят закомментированную строку, и IE рассматривает ее как оператор для выполнения.

Из-за этого отображается только один тег body и используется только один.


Более подробное объяснение

<!--[if (gt IE 9)|!(IE)]><!-->
<body>
<!--<![endif]-->

Для IE это говорит:

<if greater than ie9, or not ie> (ie conditional comment)
<!--> (empty comment) (--> putting this here to stop SO ruining syntax highlighting :D)
<body>
<end if> (ie conditional comment)

Если вы не понимаете, почему, прочитайте параграф, начинающийся с «Условные комментарии для работы IE ...».

Этот же блок для любого другого браузера выглядит так:

<!--[if (gt IE 9)|!(IE)]><!--> (this is just one comment, containing the text "[if (gt IE 9)|!(IE)]><!")
<body>
<!--<![endif]--> (again, just one comment, containing "<![endif]")
3 голосов
/ 09 сентября 2011
<!--[if (gt IE 9)|!(IE)]><!-->
<body>
<!--<![endif]-->

означает: выведите <body>, если версия браузера больше (gt) IE9 (например, IE10) или не IE.

Поскольку IE9 в настоящее времяпоследняя версия, это условие не выполняется ни одним IE(то же самое для <!-- в последней строке).

Но IE проанализирует <!--[if (gt IE 9)|!(IE)]> и <![endif]--> и обработает <!--><body><!-- как содержимое условного комментария.Это означает, что если условие выполнено, он выводит пустой комментарий, тег <body> и начало комментария.

MSDN содержит подробное описание условных комментариев .Кажется, вы могли бы добиться того же, используя Условные комментарии, показанные при понижении уровня * :

<![if (gt IE 9)|!(IE)]>
<p>Please upgrade to Internet Explorer version 8.</p>
<![endif]>

(хотя это недопустимый HTML).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...