第九章 客户端检测(js高级程序设计)
2019-04-01 本文已影响0人
简默丶XS
- 在现实当中,浏览器之间的差异以及不同浏览器的“怪癖”( quirk),多得简直不胜枚举。因此,客户端检测除
了是一种补救措施之外,更是一种行之有效的开发策略。 - 检测 Web 客户端的手段很多,而且各有利弊。但最重要的还是要知道,不到万不得已,就不要使
用客户端检测。只要能找到更通用的方法,就应该优先采用更通用的方法。一言以蔽之,先设计最通用
的方案,然后再使用特定于浏览器的技术增强该方案。
能力检测
判断浏览器能力,而不是区分浏览器
function getElement(id) {
if (document.getElementById) {
return document.getElementById(id);
} else if (document.all) {
return document.all[id];
} else {
throw new Error("No way to retrieve element!");
}
}
更可靠的能力检测:
使用type类型去判断属性的存在,而不是单独检测属性的存在
例如:object.solt 可能是函数,也可能是一个普通类型的值
function isSortable(object){
return typeof object.sort == "function";
}
最保守的检查方法:
//作者: 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
注意小技巧,!是取非,!!则是转换为布尔类型
能力检测不是浏览器检测:
在实际开发中,应该将能力检测作为确定下一步解决方案的依据,而不是用它来
判断用户使用的是什么浏览器。
怪癖检查
与能力检测类似, 怪癖检测(quirks detection)的目标是识别浏览器的特殊行为。但与能力检测确认浏览器支持什么能力不同,怪癖检测是想要知道浏览器存在什么缺陷(“怪癖”也就是 bug)
-
IE8 及更早版本中存在一个 bug,即如果某个实例属性与[[Enumerable]]标记为 false 的某个原型属性同名,那么该实例属性将不会出现在fon-in 循环当中
-
Safari 3 以前版本会枚举被隐藏的属性
用户代理检测
1.HTTP 规范(包括 1.0 和 1.1 版)明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。 RFC 2616(即 HTTP 1.1 协议规范)是这样描述用户代理字符串的
稀里糊涂的一章。