8、检测浏览器和操作系统

8.1 navigator对象

bom提供的最早对象之一,提供了浏览器的信息属性。

8.2 检测浏览器的方式
一般有两种检测方式:1、对象/特征检测 2、user-agent字符串检测。

8.2.1对象/特征检测法
对象检测涉及到,在使用一个给定对象之前要先检查它的存在。例如要使用DOM方法
document.getElementById(),但不确定浏览器是不是支持它。
if(document.getElementById){
//the method exists, so use it here
}else{
// do something else
}

如果属性或方法不存在就会返回undefined。Boolean的false。

注意检查函数是否存在,不能加括号。如果加了括号,解释器就会调用函数,函数不存在就
会错误。

8.2.2 user-agent字符串检测法

访问网站的程序都必须提供一个user-agent字符串来向服务器确定它的身份。服务可以通过
$ENV['HTTP_USER_AGENT']来访问。
javascript navigator对象的属性userAgent属性来提供客户端对user-agent字符串的访问。
var sUserAgent = navigator.userAgent;

8.3 user-agent字符串简史
Netscape navigator 3.0 /ie 3.0

if(parseFloat(navigator.appVersion)>=3){
//do 3.0-levelstuff here
}

因为ie
if(navigator.userAgent.indexOf("MSIE")>-1){
if(navigator.userAgent.indexOf("MSIE 3.")>-1){
//do IE 3.0 browser stuff here
}
}else if(parseFloat(navigator.appVersion>=3)){
//do other 3.0 browser stuff here
}

var isWin95 = navigator.userAgent.indexOf("Win95") > -
1||navigator.userAgent.indexOf("Windows 95") > -1;

8.3.2 ie4 nn4

Netscape:

Mozilla/AppVersion (Platform; Security [; OS-or-CPU-Description])
Mozilla/4.0 (Win98;I)

IE4.0

Mozilla/4.0 (compatible; MSIE [IEVersion];[OS])
Mozilla/4.0 (compatible; MSIE 4.0;Windows 98)

if(parseFloat(navigator.appVersion) >=4){
//do 4.0-level stuff here
}

8.3.3 IE 5.0 及更高版本

IE 5.0 user-agent字符串:
Mozilla/4.0 (compptible; MSIE 5.0; Windows NT)
Mozilla 的版本还是4.0,虽然ie版本更新了。

这个问题在IE 5.5和6.0版本依然如故。
Mozilla/4.0(compatible; MSIE 6.0; Windows NT)

8.3.4 Mozilla
作为Netscape 6开发的一部分,开发人员起草了一份简短的文档作为 user-agent字
符串的标准。新的格式代表了它首次同Netscape 原来的 user-agent字符串格式的分离。

Mozilla/MozillaVersion(Platform; Security;Os-or-CPU; Localization information?[;
PrereleaseVersion] * [; Oprional Other Comments]) Gecko/GeckoVersion
[ApplicationProduct/ApplicationProductVersion]

图 user-agent各个字符串。

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

8.3.5 Opera

Opera user-agent 格式很独特。 基本格式:
Opera/AppVersion(OS; Security)[Language]

windows xp上使用Opera 7.54,user-agent 字符串:
Opera/7.54 (Windows NT5.1; U )[en]

仅仅使用菜单的功能,opera只要更改它所报告的user-agent字符串以及调整它的一些其他特
征就可以办到这一点。(伪装成ie和Mozilla版本).

Opera 伪装成Mozilla 5.0时,它返回这样的user-agent字符串:
Mozilla/5.0(Windows NT 5.1; U) Opera 7.54
伪装成Mozilla 4.78 user-agent:
Mozilla/4.78 (Windows NT 5.1; U) Opera 7.54
伪装成IE6.0,user-agent字符串就变成这样:
Mozilla/4.0 (compatiable; MSIE6.0; Windows NT 5.1) Opera 7.54

8.3.6 Safari
Safari 的 user-agent 基本格式:
Mozilla/5.0 (Platform; Security;Os-or-CPU;Language)
AppleWebKit/AppleWebKitVersion(KHTML,like Gecko) SafariVersion

Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML,like Gecko)
Safari/125.1

8.4 浏览器检测脚本
opera 4.0+
ie4+
mozilla0.9.2+
safari 1.0+
netscape navigator 4.0-4.8.x

8.4.1方法学
检测最小版本
if(isMinIE5){
//code
}
8.4.2 第一步
var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appversion); //parseFloat 0.9.2 会丢掉2

可以用函数:
function compareVersions(sVersion1,sVersion2){
var aVersion1 = sVersion1.split(".");
var aVersion2 = sVersion2.split(".");

if(aVersion1.length > aVersion2.length){
for(var i=0; i<aVersion1.length-aVersion2.length;i++){
aVersion2.push("0");
}

}else if(aVersion1.length<aVersion2.length){
for(var i=0; i<aVersion2.length-aVersion1.length;i++){
aVersion1.push("0");
}
}
for(var i=0; i< aVersion1.length;i++){
var iVal1 = parseInt(aVersion[i],10);
var iVal2 = parseInt(aVersion[i],10);
if(iVal1 < iVal2){
return -1;
}else if(iVal1 > iVal2){
return 1;
}
}
return 0;
}

compareVersion("0.9.2","0.9"); 1

8.4.3 检测 Opera

posted @ 2013-01-26 12:09  simpman  阅读(241)  评论(0编辑  收藏  举报