Свойство navigator объекта Window ссылается на объект Navigator, содержащий об_ щую информацию о веб_броузере, такую как версия и список отображаемых форматов данных. Объект Navigator назван «в честь» Netscape Navigator, но он также поддерживается в Internet Explorer. (Кроме того, IE поддерживает свой_ ство clientInformation как нейтральный синоним для navigator. К сожалению, другие броузеры свойство с таким именем не поддерживают.)
В прошлом объект Navigator обычно использовался сценариями для определения типа броузера – Internet Explorer или Netscape. Однако такой подход к определе_ нию типа броузера сопряжен с определенными проблемами, т. к. требует посто_ янного обновления с появлением новых броузеров или новых версий существую_ щих броузеров. Ныне более предпочтительным считается метод на основе про' верки функциональных возможностей. Вместо того чтобы делать какие_либопредположения о броузерах и их возможностях, гораздо проще прямо проверить наличие требуемой функциональной возможности (например, метода). Напри_ мер, в следующем примере демонстрируется, как выполняется проверка функ_ циональных возможностей при регистрации методов обработки событий (эта те_ ма подробно рассматривается в главе 17).
14.3. Объекты Window, Screen и Navigator
if (window.addEventListener) {
// Если метод addEventListener() поддерживается, использовать его.
// Это случай совместимых со стандартами броузеров, таких как
// Netscape, Mozilla и Firefox.
}
else if (window.attachEvent) {
// Иначе, если существует метод attachEvent(), использовать его.
// Это относится к IE и другим имитирующим его нестандартным броузерам.
}
else {
// Иначе ни один из методов недоступен.
// Это характерно для старых броузеров, не поддерживающих DHTML.
}
Однако иногда определение типа броузера может представлять определенную ценность. Один из таких случаев – возможность обойти ошибку, свойственную определенному типу броузера определенной версии. Объект Navigator позволяет решать такие задачи.
Объект Navigator имеет пять свойств, предоставляющих информацию о версии работающего броузера:
appName
Название веб_броузера. В IE это строка "Microsoft Internet Explorer", в Firefox и других броузерах, в основе которых лежит программный код Netscape (та_ ких как Mozilla или собственно Netscape), значением этого свойства является строка "Netscape".
appVersion
Номер версии и/или другая информация о версии броузера. Обратите внима_ ние: этот номер следует рассматривать как внутренний номер версии, по_ скольку он не всегда соответствует номеру, отображаемому для пользовате_ ля. Так, Netscape 6 и последовавшие за ним версии Mozilla и Firefox сообща_ ют о себе номер версии 5.0. Кроме того, все версии IE от 4 до 6 сообщают о себе номер версии 4.0, что указывает на совместимость с базовой функционально_ стью броузеров 4_го поколения.
userAgent
Строка, которую броузер посылает в HTTP_заголовке USER_AGENT. Это свойство обычно содержит всю ту информацию, которая содержится в свойствах app_ Name и appVersion, а также может содержать дополнительные сведения. Одна_ ко формат представления этой информации не стандартизован, поэтому не_ возможно организовать разбор этой строки способом, не зависящим от типа броузера.
appCodeName
Кодовое имя броузера. Для Netscape используется кодовое имя «Mozilla». Для совместимости IE делает то же самое.
platform
Аппаратная платформа, на которой работает броузер. Это свойство было до_ бавлено в JavaScript 1.2.
296 Глава 14. Работа с окнами броузера
Рис. 14.1. Свойства объекта Navigator
Следующие строки JavaScript_кода выводят значения всех свойств объекта Navi_ gator в диалоговом окне:
var browser = "СВЕДЕНИЯ О БРОУЗЕРЕ:\n"; for(var propname in navigator) {
Диалоговое окно, представленное на рис. 14.1, выводится при запуске этого сце_ нария в IE 6.
Как видно из рис. 14.1, свойства объекта Navigator иногда содержат более слож_ ную информацию, чем та, которая нас интересует. Например, обычно достаточно знать лишь первые цифры из свойства appVersion. Для извлечения из объекта Navigator только необходимой информации о броузере часто используются мето_ ды parseInt() и String.indexOf(). В примере 14.3 показан программный код, обра_ батывающий свойства объекта Navigator и сохраняющий их в объекте с именем browser. С обработанными свойствами иметь дело проще, чем с исходными значе_ ниями свойств объекта navigator. Общий термин для такого кода – анализатор клиента (client sniffer), и в Интернете можно найти код более сложных и универ_сальных анализаторов. (Например, http://www.mozilla.org/docs/web'developer/ sniffer/browser_type.html.) Однако для многих целей прекрасно работают и такиепростые фрагменты кода.
Пример 14.3. Определение производителя броузера и номера версии
/**
* browser.js: простейший анализатор клиента
*
* Этот модуль объявляет объект с именем "browser", пользоваться которым
Прежде чем закончить этот раздел, необходимо сделать одно важное замечание: свойства объекта Navigator не могут служить основой для надежной идентифика_ ции броузера. Например, в Firefox 1.0 свойство appName имеет значение "Net_ scape", а свойство appVersion начинается со значения 5.0. В броузере Safari, кото_ рый не имеет ничего общего с линейкой броузеров проекта Mozilla, это свойство возвращает то же самое значение! В IE 6.0 свойство appCodeName имеет значение "Mozilla", а свойство appVersion начинается со значения 4.0. Причина такого по_ ложения вещей кроется в следующем: в прошлом было создано так много про_ граммного кода, анализирующего тип броузера, что производители броузеров не могут позволить себе изменять значения этих свойств, поскольку это приведет к нарушению обратной совместимости. Кстати, это одна из причин, почему ана_ лиз типа броузера все больше выходит из употребления и все чаще используются методики на основе проверки функциональных возможностей.