浏览器检测硬件的能力相当有限。不过,navigator 对象还是通过一些属性提供了基本信息。
1. 处理器核心数
navigator.hardwareConcurrency 属性返回浏览器支持的逻辑处理器核心数量,包含表示核心
数的一个整数值(如果核心数无法确定,这个值就是 1)。关键在于,这个值表示浏览器可以并行执行的 最大工作线程数量,不一定是实际的 CPU 核心数。
2. 设备内存大小
navigator.deviceMemory 属性返回设备大致的系统内存大小,包含单位为 GB 的浮点数(舍入
为最接近的 2 的幂:512MB 返回 0.5,4GB 返回 4)。 3. 最大触点数
navigator.maxTouchPoints 属性返回触摸屏支持的最大关联触点数量,包含一个整数值。
客户端检测是 JavaScript 中争议最多的话题之一。因为不同浏览器之间存在差异,所以经常需要根 据浏览器的能力来编写不同的代码。客户端检测有不少方式,但下面两种用得最多。
能力检测,在使用之前先测试浏览器的特定能力。例如,脚本可以在调用某个函数之前先检查 它是否存在。这种客户端检测方式可以让开发者不必考虑特定的浏览器或版本,而只需关注某 些能力是否存在。能力检测不能精确地反映特定的浏览器或版本。
用户代理检测,通过用户代理字符串确定浏览器。用户代理字符串包含关于浏览器的很多信息, 通常包括浏览器、平台、操作系统和浏览器版本。用户代理字符串有一个相当长的发展史,很 多浏览器都试图欺骗网站相信自己是别的浏览器。
用户代理检测也比较麻烦,特别是涉及 Opera 会在代理字符串中隐藏自己信息的时候。即使如此,用户代理字符串也可以用来确定浏览器使 用的渲染引擎以及平台,包括移动设备和游戏机。
在选择客户端检测方法时,首选是使用能力检测。特殊能力检测要放在次要位置,作为决定代码逻 辑的参考。用户代理检测是最后一个选择,因为它过于依赖用户代理字符串。
浏览器也提供了一些软件和硬件相关的信息。这些信息通过 screen 和 navigator 对象暴露出来。 利用这些 API,可以获取关于操作系统、浏览器、硬件、设备位置、电池状态等方面的准确信息。