一、能力检测
能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。能力检测要先检测达成目的的最常用的特性,这样可以保证代码最优化。并且,能力检测必须检测实际要用到的特性,因为一个特性不存在,并不代表另一个特性不存在。
目前,在浏览器环境下测试任何对象的某个特性是否存在,最常用的是以下函数:
function isHostMethod(object,property){
var t = typeof object[property];
return t=='function' || (!!(t=='object' && object[property])) || t=='unknown';
}
二、怪癖检测
怪癖检测的目标是识别浏览器的特殊行为,即浏览器存在什么缺陷。通常需要运行一小段代码,以确定某一特性不能正常工作。
三、用户代理检测
用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一个HTTP请求过程中,用户代理字符串是通过响应首部发送的,可以通过navigator.userAgent属性访问。
- 五大主流呈现引擎用户代理字符串
- IE
IE的用户代理字符串格式:
Moailla/4.0 (compatible; MSIE 版本号; 操作系统; Trident/Trident版本号)
IE8用户代理字符串:
Moailla/4.0 (compatible; MSIE 8.0
;Windows NT 5.1
; Trident/4.0
)
- Gecko
Gecko的用户代理字符串格式:
Mozilla/Mozilla版本号 (操作系统或CPU; 与发行版本) Gecko/Gecko版本 应用程序或产品/应用程序或产品版本号
Firefox4用户代理字符串:
Mozilla/5.0
(windows NT 6.1
;rv:2.0.1
) Gecko/20100101
Firefox 4.0.1
- KHTML
KHTML的用户代理字符串格式:
Mozilla/5.0 (compatible; Konqueror/ 版本号; 操作系统或CPU) KHTML/KHTML版本号 (like Gecko)
示例:
Mozilla/5.0 (compatible; Konqueror/ 3.5
;SunOS
) KHTML/3.5.0
(like Gecko)
- WebKit
WebKit的用户代理字符串格式如下:
Mozilla/5.0 (平台; 加密类型; 操作系统或CPU; 语言) AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Safari/Safari版本号
示例:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1
- Opera
Opera 10的代理字符串格式如下:
Opera/9.80 (操作系统或CPU; 加密类型; 语言) Presto/Presto版本号 Version/版本号
其中,
Presto是Opera的呈现引擎。加密类型:U(128位加密)、I(40位加密)、N(未加密)
如Windows7中Opera10.63的用户代理字符串如下:
Opera/9.80 (Windows NT 6.1
;U
;en
) Presto/2.6.30
Version/10.63
但Opera有两种修改用户代理字符串的方式。第一种是将自身标识为另外一个浏览器,如Firefox:
Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
第二种是把自己装扮成Firefox或IE,这种情况下的用户代理字符串中既没有Opera字样,也不包含Opera版本信息。
2.用户代理字符串检测
- 第一步是识别Opera。因为它的用户代理字符串有可能完全模仿其他浏览器。可以用window.opera对象检测Opera。调用Version()方法可以返回一个表示浏览器版本的字符串。
- 第二步是识别WebKit。因为WebKit的用户代理字符串中包含Gecko和KHTML这两个字符串。但是WebKit用户代理字符串中的AppleWebkit是独一无二的,可以通过检测这个字符串来确定是否是Webkit。
- 第三步是检测KHTML。因为KHTML的用户代理字符串中也包含Gecko,所以在排除KHTML之前,无法准确检测基于Gecko的浏览器。在排除了WebKit之后,可以用过检测‘KHTML’字符串来检测KHTML引擎。但由于Konqueror3.1及更早版本中不包含KHTML的版本,所以同时需要检测Konqueror。
- 第四步是检测Gecko。派出了Webkit和KHTML之后,可以通过检测‘Gecko’字符串来检测Gecko引擎。
- 最后检测的是IE。可以通过查找‘MSIE’来检测是否为IE引擎。
代码如下:
var client = function(){
var engine={
//呈现引擎
ie: 0,
gecko: 0,
webkit: 0,
khtml: 0,
opera: 0,
//具体版本号
ver: null
};
//检测呈现引擎
//Opera
var ua = navigator.userAgent;
if(window.opera){
engine.ver = window.opera.version();
engine.opera = parseFloat(engine.ver);
}else if(/AppleWebKit\/(\S+)/.test(ua)){ //Webkit
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
}else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ //KHTML
engine.ver = RegExp['$1'];
engine.khtml = parseFloat(engine.ver);
}else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ //Gecko
engine.ver = RegExp['$1'];
engine.gecko = parseFloat(engine.ver);
}else if(/MSIE ([^;]+)/.test(ua)){ //ie
engine.ver = RegExp['$1'];
engine.ie = parseFloat(engine.ver);
}
}();