《JavaScript高级程序设计》Chapter 9 客户端检测
先稍微了解,具体用到可以再翻阅资料。
为了消除浏览器之间的差异。
不到特定时刻不要使用客户检测手段,应该优先考虑通用方法,再考虑浏览器特殊性。
分为能力检测(特性检测)、怪癖检测(浏览器的bug)、用户代理检测(不推荐使用)
能力检测(特性检测)
- 检测浏览器是否具有某个特性(能力),以使用该特性或者能力进行下一步操作。目标不是为了检测浏览器而是检测其是否支持特定的能力。
- 通常将最常用的特性放在一开始检测(可以有效避免浪费时间),并且要避免逻辑上出现问题(比如说认为一个特性存在,那么相关的另一个逻辑也存在)
- 可靠的能力检测逻辑:
- 用typeof进行检测,虽然typeof有的时候也会出现问题
- IE8及之前的版本中,某些方法(COM)会返回object,或者unknown
- 使用考虑充分的检测方式解决这个问题:
function isHostMethod(object, property){ var t = typeof object[property]; return t == 'function' || (!! (t=='object' && object[property])) || t = 'unknown'; }
- 注意到双逻辑非符号得到布尔值,优于先存储后访问的做法。
- 能力检测,而非浏览器检测,最好根据浏览器的不同将能力组合起来,一次性检测所有相关特性。
- 仍然要注意到浏览器的不断发展和变化:
- 同一个浏览器,曾经不支持的,新版本不一定不支持
- 同一个浏览器,曾经支持的,新版本不一定支持
- 不同浏览器之间,曾经一个浏览器特有的功能或者写法,说不定另一个浏览器也开始支持(所以不要判断浏览器,而是判断特性)
怪癖检测
- 识别浏览器的特殊行为,有什么怪癖(bug)。运行代码,确定某一特性不能正常工作。
- 不需要针对特定的对象,直接运行检测函数得到结果就可以了。
- 最好在脚本一开始执行这类检测,检测对当前程序有直接影响的怪癖。
用户代理检测
- 原理:在HTTP请求中,用户代理字符串(可以用来确定用户实际使用的浏览器)作为响应的首部发送,可通过JS中的navigator.userAgent属性访问。
- 服务端,通过代理字符串确定浏览器是常见做法,然而客户端却有争议,优先级排在能力检测和怪癖检测之后。
- 用户代理字符串的历史(为什么会需要这个检测,电子欺骗)
- 电子欺骗:浏览器在自己的用户代理字符串中加入错误或误导的信息,欺骗服务器。
- 规定:标识符/产品版本号 --- >实际更加复杂
- 电子欺骗举例:新生浏览器为了记入兼容平台,伪装成已经普遍应用的浏览器(IE伪装成Mozilla)
- 用户代理字符串检测技术:显然并不容易
- 识别呈现引擎(比知道浏览器的名字和版本号更好)IE、Gecko、Webkit、KHTML、Opera
- 检测顺序很重要:opera>Webkit(包含"KHTML","Gecko")>KHTML("Gecko")>Gecko>IE
- 比如第一步检测opera,因为只有它会伪装成其他引擎,而其他引擎一般不会伪装成它(根据上一小节用户代理字符串的历史可知)。
- 识别呈现引擎(比知道浏览器的名字和版本号更好)IE、Gecko、Webkit、KHTML、Opera
-
- 识别浏览器(呈现引擎-->JS引擎/浏览器类型):client中添加browser对象
- 识别平台(Windows、Mac、Unix):client中添加system对象 navigator.platform
- 识别windows操作系统:
- 识别移动设备
- 识别游戏系统
- 完整代码在pdf P261页 9.3.3小节中
- 使用方法(不到必要的时候不使用)
- 客户端检测的最后一个选择,能力检测和拐臂检测优于它
- 当不能直接准确的使用前两种检测的时候使用(前两种检测获取不到足够的信息)
- 同一款浏览器在不同平台下具备不同能力(确实必要的时候)
- 为了跟踪分析等目的需要知道确切的浏览器(同上)