- 8.1 navigator对象
- 8.2 检测浏览器的方式
主要有两种方式来检测浏览器:1.对象/特征检测法 2.user-agent字符串检测法
-
8.2.1对象/特征检测法
if(document.getElementById) { //the method exists, so user it here } else { //do something else }
- 8.2.2 user-agent字符串检测法
常见的浏览器user-agent字符串:
浏览器 | user-agent字符串 |
Internet Explorer6.0(Windows XP) | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) |
Mozilla 1.5(Windows XP) | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5)Gecko/20031007 |
Firefox 0.92(Window XP) | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7)Gecko/20040707 Firefox/0.8 |
Opera 7.54(Windows XP) | Opera/7.54(Windows NT 5.1; U) |
Safari 1.25(MacOS X) | Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) Apple-Webkit/124 (KHTML,like Gecko) Safari/125.1 |
- 8.3 user-agent 字符串简史
- 8.3.1 Netscape Navigator 3.0 与 IE3.0
Netscape Navigator 3.0 的user-agent的字符串格式非常简单:如下:
Mozilla/Appversion (Platform; Security [; Os-or CPU-Description])
例如:运行于Windows 95上的Netscape Navigator 3.0 user-agent如下:
Mozilla/3.0(Win95; I)
注:I表示安全较低 N表示没有安全 U表示128位加密安全性(在美国大部分现在的浏览器都有128位安全性)
微软引入IE3.0,并提供了一个与Netscape Navigator 完全兼容的user-agent字符串.这样任何检查它(当时针对Netscape进行检查是一种标准)的服务器就会允许IE浏览页面.
格式:Mozilla/2.0 (compatible; MSIE [IEVersion];[OS]);
例如运行于Windows 95上的IE 3.02有如下user-agent字符串:
Mozilla/2.0 (compatible; MSIE 3.02;Windows 95);
本来开发人员只希望用一个酸法就能检测出3.0的浏览器,例如:
if(parseFloat(navigator.appVersion)>=3.0){
//do 3.0-level stuff here
}
现在酸法变为:
if(navigator.userAgent.indexOf("MSIE") > -1){
//IE,now check the version
if(navigator.userAgent.indexOf("MSIE 3.") > -1){
//do ie 3.0 brower stuff here
}
}else if(parseFloat(navigator.appVersion) >= 3){
//do other 3.0 brower stuff here
}
因为Netscape和微软用了不同的字符串来表示同一个操作系统,所以对操作系统必须进行两次检验.例如:
var isWin95 = navigator.userAgent.indexOf("Wind95") > -1 || navigator.userAgent.indexOf("Windows 95") > -1;
- 8.3.2 Netscape Communicator 4.0 与 IE4.0
Netscape Communicator 4.0
检测浏览器和版本以及操作系统方法和Netscape Navigator 3.0检测方法一样
IE4.0发布,这次将Mozilla的版本改成4.0了
Mizilla/4.0 (compatible; MSIE [IEVersion]; [OS])
例如:运行在Windows 98上的IE4.0 返回如下:
Mozilla/4.0(compatible; MSIE 4.0; Windows 98)
所以确定浏览器是否为4.0:
if(parseFloat(navigator.appVersion) > = 4.0){
//do 4.0-level stuff here
}
但是微软为MacOS发布的IE4.5很让人困惑,版本如下:
Mozilla/4.0(copatible; MSIE 4.5;Mac_PPC)
- 8.3.3 IE5.0及更高版本
user-agent还存在同样混乱的问题:
如:在Windows NT 4.0上运行的IE5.0返回的user-agent字符串:
Mozilla/4.0 (compatible; MSIE 5.0; Window NT)
5.5,6.0同样存在,如6.0
Mozilla/4.0 (compatible; MSIE 6.0; Windwos NT)
- 8.3.4 Mozilla
作为Netscape 6 (Mozilla)开发的一部分,开发人员起草了一份简短的文档作为user-agent字符串的标准.
Mozilla/MozillaVersion (Platform ; Security ; OS-or-CPU ; Localization infomation? [; PrereleaseVersion ]* [; Optional Other Comments] ) Gecko/GeckoVersion
[ApplicationProduct/ApplicationProductVersion]
字符串 | 是否必须 | 描述 |
MozillaVersion | 是 | Mozilla 的版本 |
Platform | 是 | 使用操作系统的类型.可能的值:Windows\Macintosh\X11(Unix上的) |
Security | 是 | 浏览器的安全性.可能的值:N(没有安全性),u( 高度安全性),I(弱安全性) |
OS-or-CPU | 是 | 浏览器运行的操作系统或者是运行浏览器的计算机的处理器类型.如果Platform是Windows,那么这是Windows的版本(如WinNT或Win 95 等等).如果platform是Macintosh,那么这是CPU的类型(68Khuozhe PPC代表PowerPC).如果Platform是X11,那么这是Unix操作系统的名称从Unix命令uname-sm中获得 |
Localization infomation | 是 | 浏览器语言.典型的是美国使用的en-US |
PrereleaseVersion | 否 | 用于这个浏览器的开放源代码的Mozilla代码的基础版本.注意,这个一直未被使用,直到Mozilla 0.9.2(Netscape 6.1) |
Optional Other Comments | 否 | 这是留给各自的Mozilla实现添加额外信息的空间 |
GeckoVersion | 是 | 使用Gecko渲染引擎的版本.这是按照yyyymmdd格式的日期 |
ApplicationProduct | 否 | 使用Mozilla代码的品派浏览器的名称.在Netscape 6 发行版中,这个是Netscape6:Netscape7改成Netscape |
ApplicationProductVersion | 否 | 使用Mozilla代码品牌浏览器的版本 |
运行于Windows XP 的Netscape 6.2.1:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1
为什么MozillaVersion是5.0版呢?
Netscape 7.1是Netscape系列浏览器的最后一个版本.AOL更新了她与为软的许可证条款来使IE作为AOL软件内置的浏览器,然后就解散了Netscape小组.
现在Mozilla项目依然在发布自己的新版本的浏览器,同时还有一个更易用的版本,叫做Firefox
- 8.3.5 Opera
基本的格式如下:
Opera/AppVersion (OS; Security) [Language]
如在Windows XP计算机上使用Opera 7.54 的user-agent如下显示:
Opera/7.54 (Windows NT 5.1; U) [en]
注:在7.0版本之前,Opera使用解释过的Windows操作系统字符串的意思.例如 Windows NT 5.1使用Windows XP.为了和标准兼容,7.0使用官方报告的操作系统版本.
伪装:
Opera 伪装Mozilla 5.0如下:
Mozilla /5.0 (Windows NT 5.1; U) Opera 7.54
Opera 伪装Mozilla 4.78
Mozilla /4.78 (Windows NT 5.1; U) Opera 7.54
Opera 伪装Mozilla 3.0如下:
Mozilla /3.0 (Windows NT 5.1; U) Opera 7.54
Opera 伪装成IE6.0
Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1) Opera 7.54
- 8.3.6 Safari
2004,Apple推出该浏览器.
Unix的Konqueror浏览器的主要组建--->KHTML开源项目--->Apple Web Kit---->Safari(作为Aplle Web KiT的应用程序而被创建).目前作为所有MacOS X的默认WEB浏览器搭载在所
有的零售版中.
Safari的user-agent字符串的基本格式:
Mozilla/5.0 (Platform; Security; OS-or-CPU; Language) AppleWebKet/AppleWebKetVersion (KHTML,like Gecko) Safari/SafariVersion
如:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)AppleWebKit/124 (KHTML, like Gecko) Safari/Safari125.1
- 8.3.7 结语
- 8.4 浏览器检测脚本
- 8.4.1 方法学
实际的做法是检测最小的版本而不是直接检测准确的版本.
如:
if( isMinIE5 ){
}
- 8.4.2 第一步
将user-agent字符串及版本信息保存到本地变量中.
var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appVersion);
两个版本字符串比较的最好办法是:
function compareVersions(sVersion1,sVersion2){
//转换成数组
var aVersion1 = sVersion1.split(".");
var aVersion2 = sVersion2.split(".");
//缺位补0
if(aVersion1.length > aVersion2.length){
for(int i = 0; i < aVersion1.length - aVersion2.length; i++){
aVersion2.push("0");
}
}
else if(aVersion1.length < aVersion2.length){
for(int i = 0; i < aVersion2.length - aVersion1.length; i++){
aVersion2.push("0");
}
}
//比较
for( int i = 0; i < aVersion1.length; i++){
if(aVersion1[i] > aVersion2[i]){
return 1;
}
if(aVersion1[i] > aVersion2[i]){
rturn -1;
}
}
return 0;
}
- 8.4.3 检测Opera
先考虑下Opera字符串格式
Opera/7.54 (Windows NT 5.1; U)
Mozilla/5.0 (Windows NT 5.1; U) Opera 7.54
Mozilla/4.78 (Windows NT 5.1;U ) Opera 7.54
Mozilla/3.0 (Windows NT 5.1;U ) Opera 7.54
Mozilla/4.0 (compatible;MSIE 6.0; Windows NT 5.1) Opera 7.54
考虑到所有串都包含Opera子串,而其它浏览器并未包含该子串,检测是否是Opera:
var isOpera = sUserVersion.indexof("Opera") > -1;
检测版本:
var isMinOpera4 = isMinOpera5 = inMinOpera6 =inMinOpera7 =inMinOpera7_5 =false;
if(inOpera){
var fOperaVersion;
if(navigator.appName == "Opera"){
fOperaVersion = fAppVersion;
}else{
var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");
reOperaVersion.test(sUserAgent);
fOperaVersion = parseFloat(RegExp.["$1"]);
}
isMinOpera4 = fOperation >= 4;
isMinOpera4 = fOperation >= 5;
isMinOpera4 = fOperation >= 6;
isMinOpera4 = fOperation >= 7;
isMinOpera4 = fOperation >= 7.5;
}
- 8.4.4 检测Konqueror/Safari
基于Khtml的user-agent的字符串:
Mozilla/5.0 (compatible; Konqueror/2.2.2; SunOS)
Mozilla/5.0 (compatible; Konqueror/3; Linux; de,en_US,de_DE)
Mozilla/5.0 (compatible; Konqueror/3.1; Linux 2.4.20)
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML,like Gecko)
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/51 (like Gecko) Safari/51
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/106.2 (KHTML, like Gecko) Safari/100.1
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1
前四个字符串出自Konqueror,最后三个出自Safari.
检测是否基于khtml:
var isKhtml = sUserAgent.indexOf("KHTML") > -1
|| sUserAgent.indexOf("Konqueror") > -1
|| sUserAgent.indexOf("AppleWebKit") > -1
判断是何种KHTML
if(isKHTML){
isSafari = sUserAgent.indexOf("AppleWevKit") > -1;
isKonq = sUserAgent.indexOf("Konqueror") > -1;
}
设置版本变量:
var isMinSafari1 = isMinSafari1_2 = false;
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;
判断版本:
if(isKHTML){
isSafari = sUserAgent.indexOf("AppleWevKit") > -1;
isKonq = sUserAgent.indexOf("Konqueror") > -1;
if(isSafari){
var reAppleWebKit = new RegExp("AppleWebKit\\/(\\d+(?:\\.\\d*)?)");
reAppleWebKit.test(sUserAgent);
var fAppleWebKitVersion = parseFloat(RegExp.["$1"]);
isMinSafari1 = fAppWebKitVersion >= 85;
isMinSafari1_2 = fAppWebKitVersion >= 124;
}else if(isKonq){
var reKonq = new RegExp("Konqueror\\/(\\d+(?:\\.\\d*)?)");
reKonq.test(sUserAgent);
isMinKonq2_2 = compareVersions(RegExp["$1"],"2.2") >= 0 ;
isMinKonq3 = compareVersions(RegExp["$1"],"3.0") >= 0 ;
isMinKonq3_1 = compareVersions(RegExp["$1"],"3.1") >= 0 ;
isMinKonq3_2 = compareVersions(RegExp["$1"],"3.2") >= 0 ;
}
}
-
8.4.4 检测IE
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)
考虑到Opera浏览器的伪装,检测IE需要下面:
var isIE = sUserAgent.indexOf("compatible") > -1
&& sUserAgent.indexOf("MSIE") > -1
&& !isOpera;
检测IE版本:
var isMinIE4 = isMinIE5 =isMinIE5_5 = isMinIE 6 = false;
if(isIE){
var reIE = new RegExp("MSIE (\\d+\\.\\d+)");
reIE.test(sUserAgent);
var fIEVersion = parseFloat(RegExp["$1"]);
isMinIE4 = fIEVersion >= 4;
isMinIE5 =fIEVersion >= 5;
isMinIE5_5 =fIEVersion >= 5.5;
isMinIE6 = fIEVersion >= 6.0
}
-
8.4.4 检测Mozilla
Mozilla 的user-agent字符串:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1
考虑到Opera伪装Mozilla:
Mozilla/5.0 (Windows NT 5.1; U) Opera 7.54
但是Mozilla包含字符Gecko 故检测方法:
var isMoz = sUserAgent.indexOf("Gecko") > -1;
然而基于KHTML的浏览器包含字符 "like Gecko",故
var isMoz = sUserAgent.indexOf("Gecko") > -1 && !isKHTML;
检测版本号:
var isMinMoz1 = isMinMoz1_4 = isMin1_5 =false;
if(isMoz){
var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");
reMoz.test(sUserAgent);
isMinMoz1 = compareVersions(RegExp["$1"],"1.0") >= 0;
isMinMoz1_4 = compareVersions(RegExp["$1"],"1.4") >= 0;
isMinMoz1_5 = compareVersions(RegExp["$1"],"1.5") >= 0;
}
-
8.4.5 检测Netscape Communicator 4.0
检测浏览器类型:
var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML
&& (sUserAgent.indexOf("Mozilla") == 0)
&& (navigator.appName == "Netscape")
&& ((fAppVersion >= 4.0) && (fAppVersion <= 5.0));
检测版本:4.0 4.5(主要发布版本,代码做了大量的改进) 4.7(另一个主要发布版本) 4.8(最后版本)
var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 =false;
var (isNS4){
isMinNS4 = true;
isMinNS4_5 = fAppVersion >=4.5;
isMinNS4_7 = fAppVersion >=4.7;
isMinNS4_8 = fAppVersion >=4.8;
}
-
8.5 平台/操作系统检测脚本
-
8.5.1 方法学
-
8.5.2 方法学
var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var isMac = (navigator.platform == "Mac68k") || (navigator.platform == "MacPPC")
|| (navigator.platform == "Macintosh");
-
8.5.3 检测Windows操作系统
var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
if(isWin){
isWin95 = sUserAgent.indexOf("Win95") > -1 || sUserAgent.indexOf("Windows 95") > -1;
isWin98 = sUserAgent.indexOf("Win98") > -1 || sUserAgent.indexOf("Windows 98") > -1;
isWinMe = sUserAgent.indexOf("Win 9x 4.90") > -1 || sUserAgent.indexOf("Windows Me") > -1;
isWin2K = sUserAgent.indexOf("Win NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
isWinXP = sUserAgent.indexOf("Win NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
isWinNT4 = sUserAgent.indexOf(WinNT)
|| sUserAgent.indexOf("Windows NT") > -1
|| sUserAgent.indexOf("WinNT4.0") > -1
|| sUserAgent.indexOf("Windows NT 4.0") > -1
&& (!isWinME && !isWin2K && !isWinXP);
}
-
8.5.4 检测Macintosh操作系统