9. 客户端检测
人们总是提出浏览器应该支持一些公共功能,但是现实是,浏览器有各自的“怪癖”。
9.1 能力检测
- 能力检测的目标不是识别特定浏览器,而是识别浏览器的能力。采用这种方式不必顾及特定的浏览器如何如何,只要确定浏览器支持特定的能力,就可以给出解决方案。
// 能力检测的基本模式
if(object.property){
// use object.property
}
typeof
检测是否是函数DOM
对象是宿主对象- 能力检测,而不是浏览器检测,不注重是什么浏览器,而注重浏览器具有什么能力
9.2 怪癖检测
quirks detection
识别浏览器的特殊行为(怪癖?bug?)
// IE8以前:实例属性,遇到原型上[[Enumerable]]==false的同名属性,会错误地不出现在for-in循环中
function hasDontEnumQuirks(){
var obj = {toString: function(){}};
for(let key in obj){
if(key === 'toString'){
return fasle;
}
}
return true;
}
// Safari3以前:会枚举[[Enumerable]]==false的属性
function hasEnumShadowQuirks(){
var obj = {toString: function(){}};
var count = 0;
for(let key in obj){
if(key === 'toString'){
count++;
}
}
return count > 1;
}
9.3 用户代理检测
userAgent
用户代理通过检测用户代理字符串来确定实际使用的浏览器- 在每一次HTTP请求过程中,用户代理字符串是作为响应头部发送的
- 用户代理字符串历史
- 早期浏览器
- 1993,NCSA,世界第一款浏览器
Mosaic
- NetScape Communications,
Mozilla
(mosaic killer)
- 1993,NCSA,世界第一款浏览器
- NetscapeNavigator 3 和 Internet Explorer 3
- Internet Explorer,通过用户代理字符串
Mozilla/2.0
伪装成NetscapeNavigator
- Internet Explorer,通过用户代理字符串
- Netscape Communicator 4 和 IE4~IE8
- trident
Gecko
呈现引擎- Netscape 6
Mozilla/5.0
- WebKit
- 2003,
Apple
宣布开发Safari
,呈现引擎叫WebKit
,是Linux
平台中Konqueror
浏览器的呈现引擎KHTML
的一个分支 - 如何确保不被流行站点拒之门外 —>
Mozilla/5.0
- 至今,基于
webkit
的所有浏览器都将自己标识为Mozilla/5.0
- 2003,
- Konqueror
- KHTML
- 效仿IE,
Mozilla/5.0
- Chrome
- 以Webkit作呈现引擎,但适用不同的JavaScript引擎
- Opera
Opera/8.0 (Windows NT 5.1; U; en)
最合理的用户代理字符串presto
是opera的呈现引擎- 隐瞒身份
- ios和android
- 默认基于webkit
- 早期浏览器
- 用户代理字符串检测技术
- 识别呈现引擎:IE、Gecko、Webkit、KHTML、Opera
- 识别浏览器:ie、chrome、Firefox、opera、Safari
- 识别平台:windows,mac,unix
- 识别
windows
- 识别移动设备
windows最早有两种版本,分家庭版和商业版。针对家庭版的是
Windows95
、Windows98
和Windows ME
。
而针对商业用户的版本则一直是Windows NT
,最后由于市场原因,更名Windows 2000
。
这两个产品线后来又合并成一个由Windows NT
发展而来的代码基,代表产品就是Windows XP
。
随后,微软又在XP
基础上构建了Windows Vista
windows版本 | 常见用户代理字符串 |
---|---|
95 | Win95 |
98 | Win98 |
NT4.0 | WinNT4.0 |
2000 | Windows NT 5.0 |
ME | Win 9x 4.90 |
XP | Windows NT 5.1 |
Vista | Windows NT 6.0 |
7 | Windows NT 6.1 |