9.1 能力检测
最常用也最为人们广泛接受的客户端检测形式是能力检测(又称特性检测)。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。
if (object.propertyInQuestion){
//使用 object.propertyInQuestion
}
9.1.1 更可靠的能力检测
检测某个属性是否存在并不能确定对象是否支持排序。更好的方式是检测 sort 是不是一个函数。
//这样更好:检查 sort 是不是函数
function isSortable(object){
return typeof object.sort == "function";
}
9.1.2 能力检测,不是浏览器检测
检测某个或某几个特性并不能够确定浏览器。如果你知道自己的应用程序需要使用某些特定的浏览器特性,那么最好是一次性检测所有相关特性,而不要分别检测。
//确定浏览器是否支持 Netscape 风格的插件
var hasNSPlugins = !!(navigator.plugins && navigator.plugins.length);
//确定浏览器是否具有 DOM1 级规定的能力
var hasDOM1 = !!(document.getElementById && document.createElement && document.getElementsByTagName);
9.2 怪癖检测
与能力检测类似,怪癖检测(quirks detection)的目标是识别浏览器的特殊行为。主要是想要知道浏览器存在什么缺陷(“怪癖”也就是 bug)。
我们建议仅检测那些对你有直接影响的“怪癖”,而且最好在脚本一开始就执行此类检测,以便尽早解决问题。
9.3 用户代理检测
用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一次 HTTP 请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过 JavaScript 的 navigator.userAgent 属性访问。
电子欺骗指的是浏览器通过在自己的用户代理字符串加入一些错误或误导性信息,来达到欺骗服务器的目的。
9.3.1 用户代理字符串的历史
HTTP 规范(包括 1.0 和 1.1 版)明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。
9.3.2 用户代理字符串检测技术
考虑到历史原因以及现代浏览器中用户代理字符串的使用方式,通过用户代理字符串来检测特定的 浏览器并不是一件轻松的事。因此,首先要确定的往往是你需要多么具体的浏览器信息。