第9章 客户端检测
- 不到万不得已,不要使用客户端检测
能力检测
- 最常用也最为人们广泛接受的客户端检测形式是能力检测(又称特性检测)
- 1.先检测答到目的的最常用的特性,保证代码最优化,在多数情况下都可以避免测试多个条件
- 2.必须测试实际要用到的特性,即一个特性国的存在,不一定意味着另一个特性也存在
更可靠的能力检测
确定一个对象是否支持排序,检测其是否是有排序属性并不能确定这个对象是否支持排序,更好的方法是确定sort是不是一个函数
1
2
3function isSortable(object){
return typeof object.sort=="function";
}但是宿主兑现更没有义务让typeof返回合理的值,因此在浏览器环境下的测试任何对象的某个特性是否存在,要使用下面这个函数
1
2
3
4function isHostMethod(object,property){
var t=typeof object[property];
return t=='function'||(!!(t=='object'&&object[property]))||t=='unknown';
}
能力检测,不是浏览器检测
- 检测某个或几个特性并不能够确定浏览器
- 确定浏览器是否支持Netscape风格的插件
var hasNSPlugins=!!(navigator.plugins&&navigator.plugins.length);
- 确定浏览器是否支持DOM1级规定的能力
var hasDOM1=!!(document.getElementById&&document.createElement&&document.getElementsByTagName);
怪癖检测
- 怪癖检测的目的是识别浏览器的特殊行为
IE8及更早的版本会存在:如果某个实例属性与[[Enumerable]]标记为false的某个原型属性同名,那么该实例属性将不会出现在for-in循环中
1
2
3
4
5
6
7
8
9
10var hasDontEnumQuirk = function () {
var o = { toString: function () {} };
for (var prop in o) {
if (prop == "toString") {
return false;
}
}
return true;
}();
console.log(hasDontEnumQuirk);Safari3以前的版本会枚举被隐藏的属性
1
2
3
4
5
6
7
8
9
10
11
12
var hasEnumShadowsQuirk = function () {
var o = {toString: function () {}};
var count = 0;
for (var prop in o) {
if (prop == "toString") {
count++;
}
}
return (count==1);
}();
console.log(hasEnumShadowsQuirk);
用户代理检测
- 用户代理检测通过检测用户代理字符串来确定实际使用的浏览器
- 在每一次HTTP请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过JavaScript的navigator.userAgent属性访问
- 在服务器端,通过检测用户代理字符串来确定用户使用过的浏览器是一种常用且广为接受的做法
- 在客户端,检测用户代理是一种万不得已采用的做法
- 电子欺骗:浏览器通过在自己的用户代理字符串中加入一些错误或误导的信息,达到欺骗服务器的目的
用户代理字符串的历史
- 加密类型:即安全加密的类型。U:128位加密 I:40位加密 N:未加密
用户代理字符串检测技术
- 一般情况下,知道呈现引擎和最低限度的版本就足以确定正确的操作方法了
识别呈现引擎
- 五大呈现引擎:IE、Gecko、WebKit、KHTML、Opera
- 正确地检测顺序:1.Opera 2.WebKit 3.KHTML 4.Gecko 5.IE
识别浏览器
- 只有呈现引擎还不能说明存在所需的JS功能
识别平台
- 在某些条件下,平台可能是必须关注的问题
- 目前三大主流平台:Windows、Mac、Unix
使用用户代理检测的场景
- 不能直接准确地使用能力检测或怪癖检测
- 用一款浏览器在不同平台下具备不同的能力
- 为了跟踪分析等目的需要知道确切的浏览器