Статьи

Когда браузеры сосут: PHP на помощь!

В этой короткой статье я покажу, как заменить длинный клиентский код обнаружения браузера JavaScript серверным эквивалентом, написанным на PHP.

В карьере каждого веб-дизайнера бывают случаи, когда различия между браузерами делают невозможным получение одинакового кода для одинаковой работы во всех браузерах. На момент написания этой статьи стандартный заголовок страницы SitePoint, например, разделяет некоторые поля формы на довольно небольшие пространства. Методы, которые делают это возможным, варьируются от браузера к браузеру.

В таких случаях разработчики часто прибегают к коду обнаружения браузера, например так:

<script language="JavaScript" type="text/javascript"> 
if (navigator.appName == "Netscape" &&
   parseInt(navigator.appVersion) > 4) {
 document.writeln("<!-- Netscape 6 specific code -->");
} else {
 document.writeln("<!-- Code for other browsers -->");
}
</script>

Мало того, что это довольно уродливо для чтения и обслуживания, но когда фрагменты кода, требуемые для каждого браузера, длиннее, чем строка или две, бремя дополнительного кода, который должен быть загружен всеми браузерами, может начать замедлять процесс загрузки страницы. , Помните, JavaScript запускается в браузере пользователя, поэтому код для всех браузеров загружается, хотя фактически используется только один из сегментов кода.

Когда размер кода становится проблемой, часто предпочтительнее выполнять обнаружение браузера на стороне сервера. Вот эквивалент приведенного выше примера JavaScript в PHP:

 <?php 
if (!(strpos($HTTP_USER_AGENT,'Mozilla/5') === false)) {
 echo("<!-- Netscape 6 specific code -->");
} else {
 echo("<!-- Code for other browsers -->");
}
?>

Переменная $HTTP_USER_AGENT Строка, содержащаяся в этой переменной, может использоваться для определения браузера, ответственного за запрос страницы. Например, строка $HTTP_USER_AGENT

 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2

Затем мы используем функцию PHP strpos'Mozilla/5'$HTTP_USER_AGENT Чтобы различать случаи, когда 'Mozilla/5'$HTTP_USER_AGENTstrpos0strposfalse===

Это устраняет проблему большого количества кода на клиенте, но все еще довольно грязно на стороне сервера, и код может быть немного трудно запомнить. Решение состоит в том, чтобы написать себе скрипт, который выполняет обнаружение браузера и сохраняет результат в переменной, которая затем может быть использована по всему вашему сайту, где это необходимо.

Вот скрипт browserdetect.php

 <?php 

/**
*  $browser will contain one of the following values:
*      'iewin' : IE 4+ for Windows
*      'iemac' : IE 4 for Macintosh
*     'ie5mac' : IE 5 Macintosh
*      'nswin' : Netscape 4.x Windows
*     'nsunix' : Netscape 4.x Unix
*      'nsmac' : Netscape 4.x Mac
*        'ns6' : Netscape 6 / Mozilla
*/

function inAgent($agent) {
   global $HTTP_USER_AGENT;
   $notAgent = strpos($HTTP_USER_AGENT,$agent) === false;
   return !$notAgent;
}

if ( inAgent('MSIE 4') or inAgent('MSIE 5') ) {
 if ( inAgent('Mac') )
   $browser = inAgent('MSIE 5') ? 'ie5mac' : 'ie4mac';
 elseif ( inAgent('Win') ) $browser = 'iewin';
} elseif ( !inAgent('MSIE') ) {
 if ( inAgent('Mozilla/5') or inAgent('Mozilla/6') ) {
   $browser = 'ns6';  
 } elseif ( inAgent('Mozilla/4') ) {
   if ( inAgent('Mac') ) $browser = 'nsmac';
   elseif ( inAgent('Win') ) $browser = 'nswin';
   else $browser = 'nsunix';
 }
} else $browser = "unknown";

?>

С этим сценарием обнаружение браузера на стороне сервера становится довольно простым. Вот пример:

 <?php include(browserdetect.php); ?> 
<?php if ($browser == 'ns6'): ?>
 <!-- Netscape 6 specific code -->
<?php else: ?>
 <!-- Code for other browsers -->
<?php endif; ?>

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