《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,因为只有它会伪装成其他引擎,而其他引擎一般不会伪装成它(根据上一小节用户代理字符串的历史可知)。
      • 识别浏览器(呈现引擎-->JS引擎/浏览器类型):client中添加browser对象
      • 识别平台(Windows、Mac、Unix):client中添加system对象 navigator.platform
      • 识别windows操作系统:
      • 识别移动设备
      • 识别游戏系统
    • 完整代码在pdf P261页 9.3.3小节中
    使用方法(不到必要的时候不使用)
    • 客户端检测的最后一个选择,能力检测和拐臂检测优于它
    • 当不能直接准确的使用前两种检测的时候使用(前两种检测获取不到足够的信息)
    • 同一款浏览器在不同平台下具备不同能力(确实必要的时候)
    • 为了跟踪分析等目的需要知道确切的浏览器(同上)
posted @ 2017-10-25 13:40  nebulium  阅读(147)  评论(0编辑  收藏  举报