Подача HTML только в IE6 - PullRequest
       21

Подача HTML только в IE6

0 голосов
/ 17 сентября 2009

Мне нужно отобразить другой HTML, если браузер IE6 / IE7. Я знаю, что условные комментарии работают хорошо, если мы просто говорим о стилевой информации, но в данном конкретном случае это фактическая разметка.

У меня будет неупорядоченный список изображений, который будет png-24. Они будут иметь закругленные углы (отсюда необходимость прозрачности, обеспечиваемая png-24) и будут иметь стили скругленных границ в CSS (3). Поскольку IE6 не распознает png-24, я хочу иметь альтернативный список изображений, которые являются jpg, у которых уже есть границы, включенные в изображение. Это будет радовать IE6 / IE7, тогда как совместимые со стандартами браузеры получат правильную версию.

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

Итак, мой вопрос: каков наилучший способ сделать это с помощью PHP и есть ли недостатки?

Ответы [ 9 ]

5 голосов
/ 17 сентября 2009

Вы можете обнаружить его в PHP и отправить другой HTML:

$using_ie6 = ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE) || (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6,0') !== FALSE));
if ($using_ie6) {
    ...
}
else {
    ...
}

Недостатки этого метода в том, что Opera иногда отправляет MSIE 6 в своих заголовках пользовательских агентов, и это также может соответствовать IE mobile.

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

4 голосов
/ 17 сентября 2009

Используйте условные комментарии - они отлично работают с разметкой, а не только со стилевой информацией:

<!--[if lte IE 6]>
<p>Old school</p>
<![endif]-->

См. MSDN: Об условных комментариях

2 голосов
/ 17 сентября 2009
$is_ie6 = (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false));
1 голос
/ 17 сентября 2009

есть ли минусы?

О, да, очень. Вы должны вывести «Vary» заголовок, чтобы сообщить прокси / кэшам, что страница будет отличаться для каждой строки UA, что убивает эффективность кэширования. (Если вы этого не сделаете, браузеры увидят страницы с неправильной разметкой.) И, конечно, многие браузеры просто лгут о том, что они собой представляют. Я бы избегал нюхать UA везде, где это возможно - и это почти всегда возможно.

Условные комментарии намного лучше для конкретного случая представления IE с более простой разметкой. Вы можете использовать их где угодно в HTML, но обратите внимание, что предложенный MS синтаксис для разметки с понижением уровня недопустим. Для нацеливания чего-либо только на IE6 вместо этого попробуйте:

<!--[if lt IE 7]>
    (markup for IE6)
<![endif]-->

<!--[if gte IE 7]><!-->
    (markup for everyone else)
<!--<![endif]-->

Поскольку IE6 не распознает png-24, я хочу иметь альтернативный список изображений, которые являются jpg, у которых уже есть границы, включенные в изображение.

Вы пробовали одно из многих исправлений PNG , чтобы заставить прозрачность работать в IE6? Это было бы намного проще (и выглядело бы лучше), чем иметь отдельные изображения и разметку.

1 голос
/ 17 сентября 2009

Вы можете получить Browser UA, посмотрев на $_SERVER['HTTP_USER_AGENT']

Здесь - список строк UA для IE.

0 голосов
/ 17 сентября 2009

Есть ли возможность использовать что-то вроде библиотеки javascript для достижения следующих целей:

<!--[if ie]>
 // remove the #for_non_id_browsers and replace, using an ajax call or whatever, with an IE-suitable version
<![endif]-->

<div id="for_non_ie_browsers">
Page content
</div>
0 голосов
/ 17 сентября 2009

Я знаю, что это не то, что вы спросили, но я все равно ударю.

Используйте 8-битные PNG-изображения для IE 6. Он не будет выглядеть так же, как 24-битные, но это избавит вас от создания дополнительной разметки, просто дополнительной таблицы стилей с одной строкой, заменяющей background-image .

Вы выиграете немало времени, не создавая пользовательскую разметку для неисправного браузера, и конечный результат будет очень близок к тому, что вы хотите - особенно если вы можете использовать непрозрачные JPEG-файлы в прозрачных PNG вместо них.

Никто не должен быть слишком мил с IE6, хотя я (к сожалению) знаю, что не всегда можно сделать свой собственный выбор.

0 голосов
/ 17 сентября 2009

Просто другое предложение, которое должно быть возможно и в PHP. В ASP.NET вы можете написать специальные обработчики, которые смогут отправлять обратно все виды двоичных данных обратно клиенту. Вместо того, чтобы переписывать ваши страницы, вы можете связать теги изображений со специальным обработчиком изображений. Этот обработчик получит запрос, проверит строку агента пользователя от клиента, чтобы определить версию браузера, а в случае IE6 он преобразует PNG в файл JPG и отправит его обратно. В других случаях он просто возвращает файл PNG.

Ваш URL будет выглядеть как http://example.org/yourpage.php?yourimage

По сути, вы бы исправили проблему гораздо ближе к источнику проблемы. И обнаружение IE6 уже объяснено.

0 голосов
/ 17 сентября 2009

Вы можете сделать это на стороне клиента, если хотите, например: Сделайте два div, один для IE, а другой для остальной части браузера. DIV для IE будет отображать = нет; Затем вы добавите условный CSS, только для IE, и спрячете div для других браузеров и установите IE display = block

...