JavaScript-客户端检测

来源:互联网 发布:魔兽争霸3数据库 编辑:程序博客网 时间:2024/05/23 01:15

能力检测

最常用也最为人们广泛接受的客户端检测形式是能力检测(又称特性检测)。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。采用这种方式不必顾及特定的浏览器如何如何,只要确定浏览器支持特定的能力,就可以给出解决方案。

要理解能力检测,首先必须要理解两个重要的概念。第一个概念就是先检测达成目的的最常用的特性。举个例子来说,先要检测document.getElementById(),后检测document.all。先检查最常用的特性可以保证代码最优化,因为在多数情况下都可以避免测试多个条件。第二个重要的概念就是必须测试实际要用到的特性,一个特性不存在,不一定意味着另一个特性也存在。

在可能的情况下,要尽量使用typeof进行能力检测。检测某个或几个特性并不能确定浏览器。实际上,根据浏览器不同将能力组合起来是更可取的方式。如果你知道自己的应用程序需要使用某些特定的浏览器特性,那么最好是一次性检测所有相关特性,而不要分别检测。

怪癖检测

怪癖检测的目标是识别浏览器的特殊行为。怪癖检测是想要知道浏览器存在什么缺陷(“怪癖”也就是bug)。这通常需要运行一小段代码,以确定某一特性不能正常工作。一般来说,“怪癖”都是个别浏览器所独有的,而且通常被归为bug。在相关浏览器的新版本中,这些问题可能会也可能不会被修复。由于检测“怪癖”涉及运行代码,因此建议仅检测那些对你有直接影响的“怪癖”,而且最好在脚本一开始就执行此类检测,以便尽早解决问题。

用户代理检测

用户代理检测通过用户代理字符串来确定实际使用的浏览器。在客户端,用户代理检测一般被当作一种万不得已才用的做法,其优先级排在能力检测和怪癖检测之后。

提到与用户代理字符串有关的争议,就不得不提到电子欺骗,所谓的电子欺骗就是指浏览器通过在自己的用户代理字符串加入一些错误或误导性信息,来达到欺骗服务器的目的。

HTTP规范(包括1.0和1.1版)明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。RFC 2016(即HTTP1.1协议规范)是这样描述用户代理字符串的:

“产品标识符常用于通信应用程序标识自身,由软件名和版本组成。使用产品标识符的大多数领域也允许列出作为应用程序主要部分的子产品,由空格分隔。按照惯例,产品要按照相应的重要程度依次列出,以便标识应用程序。”

上述规范进一步规定,用户代理字符串应该以一组产品的形式给出,字符串格式为:标识符/产品版本号。但是,现实中的用户代理字符串则绝对没有如此简单。不同的浏览器和同一浏览器的不同版本的用户代理字符串的格式都有所不同。

考虑到历史原因以及现代浏览器中用户代理字符串的使用方式,通过用户代理字符串来检测特定的浏览器并不是一件轻松的事。因此,首先要确定的往往是你需要多么具体的浏览器信息。使用用户代理字符串可以做如下检测:

  • 识别呈现引擎
  • 识别浏览器
  • 识别平台
  • 识别Windows操作系统
  • 识别移动设备
  • 识别游戏系统

要做完这些检测的话,需要的代码量比较大,虽然有现成的代码可以用,但是我们在前面已经强调过了,用户代理检测是客户端检测的最后一个选择。只要可能,都应该优先采用能力检测和怪癖检测。用户代理检测一般适用于下列情形。

(1)不能直接准确地使用能力检测或怪癖检测。例如,某些浏览器实现了为将来功能预留的存根函数。在这种情况下,仅测试相应的函数是否存在还得不到足够的信息。

(2)同一款浏览器在不同平台下具备不同的能力。这时候,可能就有必要确定浏览器位于哪个平台下。

(3)为了跟踪分析等目的需要知道确切的浏览器。

原创粉丝点击