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)
    • NetscapeNavigator 3 和 Internet Explorer 3
      • Internet Explorer,通过用户代理字符串Mozilla/2.0伪装成NetscapeNavigator
    • 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
    • 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最早有两种版本,分家庭版和商业版。针对家庭版的是Windows95Windows98Windows 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