Как определить название и версию Web-обозревателя?
Проблема
Мне очень нужно узнать название программы Web-обозревателя и его точную
версию. Помогите!
Решение
Использование универсальной функции jspsGetProgramInfo (ЛИСТИНГ 3.1),
поддерживающей Internet Explorer, Opera, Mozilla, Firefox и Navigator. Эта
функция не принимает параметров и возвращает экземпляр особого объекта
programInfo, свойства которого предоставляют доступ к различным параметрам
Web-обозревателя.
Свойства объекта programInfо таковы:
programName — название программы Web-обозревателя;
programVersion — версия программы Web-обозревателя;
operaConpatibiiityMode— режим совместимости Opera ("MSIE6.0", "Mozilla 5.0"
или "Opera"; для всех остальных Web-обозревателей возвращает пустую строку);
programPlatform— полное название клиентской операционной системы;
programLanguage— язык, поддерживаемый Web-обозревателем ("га" для
русского языка, "en" для английского и т. д.);
systemLanguage— язык клиентской операционной системы (если Web-обозреватель
не поддерживает этот параметр, возвращается пустая строка).
Все возвращаемые этими свойствами значения имеют строковый тип.
Листинг 3.1. Функция japsGet Programinfо, возвращающая сведения о
Web-обозревателе
var JSPS_GPI_MSIE = "Microsoft Internet Explorer"; var JSPS_GPI_OPERA =
"Opera"; var JSPS_GPIJ10ZILLA = "Mozilla"; var JSPS_GPI_FIREFOX = "Firefox"; var
JSPS_GPI_NAVIGATOR = "Navigator";
// Объявление объекта Programinfо function Programinfо() {
this.programName = "";
this.programVersion = "";
this.OperaCompatibilityMode = "";
this.programPiatform = "";
this.programLanguage = "";
this.systemLanguage = ""; }
// Объявление самой функции jspsGetProgramlnfo function
jspsGetProgramlnfo()
{
var piObj = new Programlnfо(); var ua = navigator.userAgent; var an =
navigator.appName;
var isntOpera = (ua.indexOf(JSPS_GPI_OPERA) == -1) ; var nl, n2; switch (an)
{
case JSPS_GPI_MSIE:
piObj.programLanguage = navigator.browserLanguage; if (isntOpera) { piObj
.prograinName = an; nl = ua.indexOf("MSIE") + 5; n2 = ua.indexOf(";", nl);
piObj.programVersion = ua.substring(nl, n2) ; nl = n2 + 2;
n2 = ua. indexOf (",-", nl) ;
piObj.programPlatform = ua.substring(nl, n2); piObj.systemLanguage =
navigator.systemLanguage; } else {
piObj.programName = JSPS_GPI_OPERA; nl = ua.lastlndexOf(" ") + 1; n2 =
ua.length;
piObj.programVersion = ua.substring(nl, n2); piObj .OperaCoinpatibilityMode =
"MSIE 6.0"; nl = ua.indexOf("MSIE") +10; n2 = ua.indexOf(";", nl);
piObj.programPlatform = ua.substring(nl, n2); } break; case "Netscape": if
(isntOpera) {
nl = ua.indexOf(";")+ 1;
nl = ua.indexOf(";", nl) + 2;
n2 = ua.indexOf(";", nl);
piObj.programPlatform = ua.substring(nl, n2);
if (ua.indexOf(JSPS_GPI_FIREFOX) != -1) { piObj.programName =
JSPS_GPI_FIREFOX; nl = ua.lastlndexOf("/") + 1; n2 = ua.length;
piObj.programVersion = ua.substring(nl, n2) ; piObj .programLanguage =
navigator. language ; } else { piObj.programLanguage =
•bnavigator.language.substring(0, 2); if (ua.indexOf("Netscape") != -1) {
piObj.programName = JSPS_GPI_NAVIGATOR; nl = ua.lastlndexOf("/") + 1; n2 =
ua.length;
piObj.programVersion = ua.substring(nl, n2); } else {
piObj.programName = JSPS_GPI_MOZILLA; nl = ua.indexOf("rv:") + 3; n2 =
ua.indexOf(")");
piObj.programVersion = ua.substring(nl, n2); } } } else {
piObj .programName = JSPS_GPI_OPERA; nl = ua.lastlndexOf(" ") + 1; n2 =
ua.length;
piObj.programVersion = ua.substring(nl, n2); piObj.OperaCompatibilityMode =
"Mozilla 5.0"; nl = ua.indexOf("(")+ 1;
n2 = ua.indexOf(";", nl);
piObj.programPlatform = ua.substring(nl, n2); piObj.programLanguage =
navigator.browserLanguage; } break; case JSPS_GPI_OPERA:
piObj.programName = an;
nl = ua.indexof("/") + 1; n2 = ua.indexof(" ", nl);
piObj.programVersion = ua.substring(nl, n2); piObj.OperaCompatibilityMode =
an; nl = n2 + 2;
n2 = ua.indexOf(";", nl) ;
piObj.programPlatform = ua.substring(nl, n2); piObj.programLanguage =
navigator.browserLanguage; break; } return piObj; }
Хорошая идея!
Поместите объявление этой функции в файл сценариев browserdetect.js.
Впоследствии, чтобы использовать ее, достаточно будет просто подключить к
Web-странице этот файл сценариев с помощью тега:
<SCRIPT SRC="browserdetect.js"></SCRIPT>
Кроме объявления функции jspsGetPrograminfo и служебного объекта Programinfo,
листинг 3.1 содержит также объявления пяти псевдоконстант, содержащих названия
всех Web-обозревателей, опознаваемых этой функцией. Вот эти константы:
jsps_gpi_msie содержит строку "Microsoft Internet Explorer";
jsps_gpi_opera содержит строку "Opera";
jsps_gpi_mozilla содержит строку "Mozilla";
jsps_gpi_firefox содержит строку "Firefox";
jsps_gpi_navigator содержит строку "Navigator".
Мы можем использовать их в сценариях для проверки, та ли это программа
Web-обозревателя, которая нам нужна:
var pi = jspsGetPrograminfo();
if (pi.programName == JSPS_GPI_MSIE)
Пример
Вот фрагмент кода Web-страницы, выдающей сведения о программе
Web-обозревателя:
<BODY>
<SCRIPT TYPE="text/javascript"> var pi = jspsGetPrograminfo();
document.write("<Р>Название программы - " + pi.programName
+".</P>");
document.write("<Р>Версия программы - " + pi.programVersion
.+".</P>"};
if (pi.OperaCoinpatibilityMode != "")
document.write("<Р>Режим совместимости с " +pi.OperaCompatibilityMode +
".</P>"); document.write("<P>OC клиента - " + pi.programPlatform +
".</P>"); document.write("<Р>Язык программы - " + pi.programLanguage
+".</P>") ; if (pi.systemLanguage != "")
document.write("<P>H3biK ОС клиента - " + pi.systemLanguage
+".</P>"); </SCRIPT> </BODY>
Народ советует
Если нам понадобится писать сценарии, включающие многочисленные проверки
Web-обозревателя, лучше всего вызвать функцию j spsGetProgramlnfо В самом начале
и поместить возвращенное ей значение в глобальную переменную. Впоследствии нам
не придется вызывать каждый раз эту функцию — нужные данные всегда будут под
рукой.
Что дальше?
На этом борьба с Web-обозревателями не закончена. В следующей главе народ
посоветует, как управлять его окнами: открывать их, закрывать, перемещать и
изменять их размеры. Также будет представлен мастер-класс написания обработчиков
событий открытия, закрытия и перемещения этих самых окон. Так что держись,
Web-обозреватель!