第九章 客户端检测(js高级程序设计)

  • 在现实当中,浏览器之间的差异以及不同浏览器的“怪癖”( 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)

  1. IE8 及更早版本中存在一个 bug,即如果某个实例属性与[[Enumerable]]标记为 false 的某个原型属性同名,那么该实例属性将不会出现在fon-in 循环当中

  2. Safari 3 以前版本会枚举被隐藏的属性

用户代理检测

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

稀里糊涂的一章。

你可能感兴趣的:(第九章 客户端检测(js高级程序设计))