js客户端检测-能力检测&怪癖检测

698 阅读2分钟

检测Web客户端的手段很多,而且各有利弊,但是不到万不得已,不要使用客户端检测。只要能找到更通用的方法,就应该采用更通用的方法。先设计最通用的方案,然后再使用特定于浏览器的技术增强该方案。

能力检测

最常用最为广泛使用的客户端检测形式,又称特性检测。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。采用这种方式不必顾及特定的浏览器如何如何,只要确认浏览器支持特定的能力,就可以根据具体情况,给出解决方案。
能力检测有两个重要的概念:

  • 一是先检测达成目的的最常用的特性。
    先检测最常用的特性可以保证代码最优化,因为在多数情况下都可以避免测试多个条件。
  • 二是必须测试实际要用到的特性。
    一个特性的存在,不一定意味着另一个特性也存在。 在目前,浏览器环境下测试任何对象的某个特性是否存在,可以使用下面这个函数,(ps:作者是Peter Michaux)
function isHostMethod(object,property){
    var t = typeof object[property];
    return t == 'function' || (!!(t=='object' && object[property])) || t == 'unknown';
}

使用方法:

result = isHostMethod(xhr,"open");//true
result = isHostMethod(xhr,"foo");//false

浏览器不是一会对这些实现方法一成不变的,每次浏览器更新版本都有可能改变这些能力特性的实现,所以要实时对代码功能进行预测以及评估风险。最后能力检测不是浏览器检测,很多浏览器之间会有相似的能力特性,所以具体某特性不一定就是某浏览器。

怪癖检测

怪癖检测的目的是识别浏览器的特殊行为。但是与能力检测确认浏览器支持什么能力不同,怪癖检测是想要知道浏览器存在什么缺陷(“怪癖”也就是bug)。这通常需要运行一小段代码,以确认某一特性不能正常工作。

一般来说,“怪癖”都是个别浏览器所独有的,而且通常被归为bug。在相关浏览器的新版本中,这些问题可能会也可能不会被修复。由于检测“怪癖”涉及运行代码,因此建议仅检测那些对你有直接影响的“怪癖”,而且最好在脚本一开始就执行此类检测,以便尽早解决问题。

客户端检测另一部分是用户代理检测