Определение браузера Internet Explorer
Рубрика: MaxSite CMS -> PHP
Среда, 25 апреля 2007 г.
Просмотров: 5737
Подписаться на комментарии по RSS
Среда, 25 апреля 2007 г.
Просмотров: 5737
Подписаться на комментарии по RSS
Меня уже спрашивали, как сделать, чтобы на сайте отображался баннер «Загрузи нормальный браузер» только для пользователей Internet Explorer.
На самом деле все очень просто. Для этого я написал функцию maxsite_testIE().
- function maxsite_testIE() {
- $user_agent = $_SERVER['HTTP_USER_AGENT'];
- $browserIE = false;
- if ( stristr($user_agent, 'MSIE 7.0') ) $browserIE = true; // IE7
- if ( stristr($user_agent, 'MSIE 6.0') ) $browserIE = true; // IE6
- if ( stristr($user_agent, 'MSIE 5.0') ) $browserIE = true; // IE5
- return $browserIE;
- }
Эту функцию нужно прописать в любом месте, например в index.php.
После этого, в том месте, где вы хотите показать текст с призывом пользоваться FireFox (или Opera), пишем:
- <?php
- if ( maxsite_testIE() ) {
- echo '<a href="http://www.mozilla-europe.org/ru/products/firefox/">
- Не ущемляй себя!<br />
- Установи нормальный браузер!</a>';
- }
- ?>
Текст и оформление делайте уже по своему вкусу.
Для экстремалов могу предложить вместо вывода текста, сделать редирект на сайт FireFox. ;) Я правда не уверен, что ваши посетители это оценят, зато фанаты FireFox будут в восторге:
- <?php
- if ( maxsite_testIE() ) {
- header("Location: http://www.mozilla-europe.org/ru/products/firefox/");
- exit;
- }
- ?>
Гулять, так гулять! ![]()

Комментариев: 26
А зачем извращаться?
Тем более ваша функция показывает баннер тем, у кого в браузерах стоит идентификация "а-ля ИЕ" (например, в старых версиях Оперы эта опция даже стояла по умолчанию)
Conditional comments прекрасно справляются с задачей
Это отобразится только в ослике ИА
(лишние пробелы удалить)
блин, все равно порезался код...
можно погуглить, инфы про Conditional comments выше крыши
Приведите-ка пример редиректа с помощью Conditional comments? ;)
в данном случае вопрос стоял не о редиректе, а о показе баннера для пользователей ИЕ
Ну тогда приведите пример кода (хака), который покажет пользователям IE вышеприведенный текст со ссылкой на сайт FireFox. ;)
помню был такой плагин, который не пускал на блог пользователей IE )) жосткий плагин, но между прочим идеи для него у меня были ))
2Максим:
читайте http://www.quirksmode.org/css/condcom.html
<!--[if IE]>According to the conditional comment this is Internet Explorer<br />
<![endif]-->
код в комментах все равно режется
идите по ссылке в предыдушем сообщении - там прекрасно разжевано и с примерами
Должны наверное знать, что для публикации html-кода нужно его преобразовывать в спецсимволы. Теперь по сути. Сию конструкцию понимает только IE, для других же браузеров это довольно жестокое издевательство над DOM. Кроме этого, в IE полно всяческих глюков, которые тоже можно считать "идентификацией" IE :razz:
комментарии - не издевательство над dom
а именно как комментарии и воспринимают другие браузеры conditional comments
и только IE их и понимает, что собственно и было нужно
отличие СС от прочих css-хаков в том, что они поддерживаются и, скорее всего, будут поддерживаться всеми версиями ie и как раз-таки не причиняют ни малейшего вреда при использовании в других браузерах
короче, Максим, вы не в теме
обсуждение закрыто
о преобразовании в спецсимволы - не знал, теперь буду
Да, действительно, проверил: FireFox и Opera воспринимают этот код как комментарий. Может быть для небольших вставок он и годится. Для более серьезного кода я бы его не использовал, поскольку он всегда присутствует в html-странице, даже если и не отображается в нормальных браузерах. Мой способ куда более избирателен, поскольку добавляет код в страницу только для пользователей IE. Для пользователей других браузеров он вообще не генерируется и страница не содержит мусора специально для IE.
А про IE7 забыли
Кстати, вот тут подумал, а может ли быть такое, что MSIE 6.0 будет не ровно, а скажем MSIE 6.5, такое вообще бывает? И еще хотелось, чтобы код работал не только для ИЕ, но и для оперы тож, так то оперу тож втопку, надо юзать файрфокс!
Насчет дробной версии я не могу ничего сказать. Наверное тогда можно вместо 'MSIE 6.0' указать просто 'MSIE'.
Таким же образом делается определение для Оперы 'Opera' и FireFox'а - 'Firefox'. Любители IE, кстати, могут переправлять пользователей неIE, например на сайт M$ :smile:
ps Практическое применение определения браузера (для переключения css-стилей) см. в 9-м выпуске рассылки.
будущее за фф
Зачем изобретать велосипед, когда Conditional Comments работает годы и это официальный способ от Microsoft для опознания любой весрии Internet Explorer, начиная с 5.0. К тому же СС можно применять на любом типе страниц, а не только php.
Не понимаю такого фанатизма, я вот тоже пользуюсь FireFox, но он не панацея - когда, например нужно с вэбманями поработать через браузер - ничего кроме IE не получится использовать (можно полуторный FF, но после "издевательства" над ним при помощи плагина).
К тому же, мальчики, зачем навязывать свое мнение? Я вот пишу это сообщение с SONY VAIO PCG-4H2P, но я же не гноблю пользующих Rover'ы - личное дело каждого, что использовать.
Лучше бы написали плагин который определяет наличие Flash нужной версии и если флэш есть - выводится ролик, а если нет - картинка (скажем для шапки блога).:wink:
такое решение, оформленное в Javascript, существует уже довольно давно. SWFObject называется.
Максим, уже ИЕ 7-ой появился. Так что, думаю, будет уместно добавиь еще строчку
if ( stristr($user_agent, 'MSIE 7.0') ) $browserIE = true;может, лучше, наоборот, сократить искомую подстроку до "msie"?
А с этого места можно поподробнее?
if ( stristr($user_agent, 'msie') ) $browserIE = true;
Так определять браузер очень "просто"... OPERA может представиться как MSIE... поэтому надо чуть усложнить проверку
например чтобы убрать баг мерцания MSIE 6 document.execCommand("BackgroundImageCache", false, true);
в опере js потом будет работать некорректно... мягко сказать, поэтому вот код более точного определения:
function GetUserAgent($ua = null)
{
/**
* Default to the user agent that the browser sends
*/
if (is_null($ua)) {
$ua = $_SERVER['HTTP_USER_AGENT'];
}
$b = array();
/**
* Major and minor version numbers
*/
$b['is_major'] = intval(substr($ua, strpos($ua, 'Mozilla/') + 8));
$b['is_minor'] = substr($ua, strpos($ua, 'Mozilla/') + 8);
$b['is_minor'] = (int)substr($b['is_minor'], strpos($b['is_minor'], '.') + 1);;
/**
* Type of browser
*/
$b['is_ff'] = strpos($ua, 'Firefox') !== false;
$b['is_ie'] = (strpos($ua, 'MSIE') !== false && strpos($ua, 'Opera') === false);
$b['is_opera'] = strpos($ua, 'Opera') !== false;
$b['is_nn'] = (strpos($ua, 'Mozilla') !== false &&
strpos(strtolower($ua), 'spoofer') === false &&
strpos(strtolower($ua), 'webtv') === false &&
strpos(strtolower($ua), 'hotjava') === false &&
$b['is_opera'] === false &&
$b['is_ie'] === false) &&
$b['is_ff'] === false;
$b['is_konq'] = strpos($ua, 'Konqueror') !== false;
/**
* Operating system
*/
$b['is_win'] = strpos($ua, 'Win') !== false;
$b['is_mac'] = strpos($ua, 'Mac') !== false;
$b['is_nix'] = strpos($ua, 'X11') !== false;
/**
* Internet Ekplorer
*/
if ($b['is_ie'] AND !$b['is_opera']) {
$b['is_ie4'] = strpos($ua, 'MSIE 4.') !== false;
$b['is_ie5'] = strpos($ua, 'MSIE 5.') !== false;
$b['is_ie5_5'] = strpos($ua, 'MSIE 5.5') !== false;
$b['is_ie6'] = strpos($ua, 'MSIE 6.') !== false;
$b['is_ie7'] = strpos($ua, 'MSIE 7.') !== false;
/**
* Firefox
*/
} elseif ($b['is_ff']) {
$b['is_ff1'] = strpos($ua, 'Firefox/1') !== false;
$b['is_ff2'] = strpos($ua, 'Firefox/2') !== false;
/**
* Netscape Navigator
*/
} elseif ($b['is_nn']) {
$b['is_nn2'] = $b['is_major'] === 2;
$b['is_nn2up'] = $b['is_major'] >= 2;
$b['is_nn3'] = $b['is_nn2up'] && $b['is_major'] === 3;
$b['is_nn3up'] = $b['is_nn2up'] && $b['is_major'] >= 3;
$b['is_nn4'] = $b['is_nn3up'] && $b['is_major'] === 4;
$b['is_nn4up'] = $b['is_nn3up'] && $b['is_major'] >= 4;
$b['is_nn6'] = $b['is_nn4up'] && $b['is_major'] === 5;
$b['is_nn6up'] = $b['is_nn4up'] && $b['is_major'] >= 5;
$b['is_nn8'] = $b['is_nn6up'] && (bool)strpos($ua, 'Netscape/8');
/**
* Opera
*/
} elseif ($b['is_opera']) {
$b['is_opera5'] = strpos($ua, 'Opera/5') !== false;
$b['is_opera6'] = strpos($ua, 'Opera/6') !== false;
$b['is_opera7'] = strpos($ua, 'Opera/7') !== false;
$b['is_opera8'] = strpos($ua, 'Opera/8') !== false;
$b['is_opera9'] = strpos($ua, 'Opera/9') !== false;
/**
* Other. Some of the more common robots etc...
*/
} else {
$b['is_google'] = strpos($ua, 'Mediapartners-Google') !== false;
$b['is_googletb'] = strpos($ua, 'GoogleToolbar') !== false;
$b['is_ffg'] = strpos($ua, 'Feedfetcher-Google') !== false;
$b['is_googlebot'] = strpos($ua, 'Googlebot') !== false;
$b['is_newsgator'] = strpos($ua, 'NewsGatorOnline/') !== false;
$b['is_magpierss'] = strpos($ua, 'MagpieRSS') !== false;
$b['is_planetphp'] = strpos($ua, 'PlanetPHPAggregator') !== false;
$b['is_bloglines'] = strpos($ua, 'Bloglines') !== false;
$b['is_doubanbot'] = strpos($ua, 'Doubanbot') !== false;
$b['is_topix'] = strpos($ua, 'Topix.net') !== false;
$b['is_rssreader'] = strpos($ua, 'RssReader') !== false;
$b['is_nnw'] = strpos($ua, 'NetNewsWire') !== false;
$b['is_ngo'] = strpos($ua, 'NewsGatorOnline') !== false;
$b['is_gn'] = strpos($ua, 'GreatNews') !== false;
$b['is_rb'] = strpos($ua, 'RssBar') !== false;
}
/**
* Which version of windows?
*/
if ($b['is_win']) {
$b['is_98'] = strpos($ua, 'Windows 98') !== false;
$b['is_nt'] = strpos($ua, 'Windows NT 4.0') !== false;
$b['is_2000'] = strpos($ua, 'Windows NT 5.0') !== false;
$b['is_xp'] = strpos($ua, 'Windows NT 5.1') !== false;
$b['is_2003'] = strpos($ua, 'Windows NT 5.2') !== false;
$b['is_vista'] = strpos($ua, 'Windows NT 6.0') !== false;
/**
* Macs
*/
} elseif ($b['is_mac']) {
$b['is_osx'] = strpos($ua, 'OS X') !== false;
/**
* *Nix
*/
} elseif ($b['is_nix']) {
$b['is_fed'] = strpos($ua, 'Fedora/') !== false;
$b['is_ubuntu'] = strpos($ua, 'Ubuntu') !== false;
}
return $b;
}
Понятного мало
Вроде бы сработало так: MSIE 5 (или 6, 7) просто первая цифра, которая должна быть определяющей для всех IE соответствующей версии.
У Nox`а есть такй проект - http://nomsie.ru/
Спасибочки )