一、能力检测
测试浏览器是否支持某种特性。不要求事先知道浏览器信息,只需要检测自己关心的能力是否在
首先检测最常用的方式;(如,先检测document.getElementById,然后检测document.all)
其次必须检测切实需要的特性(不能通过检测document.all是否存在判断window.innerHeight是否存在)
安全能力检测:
检测某个特性是否存在的同时,验证其是否具有预期的能力
尽量使用typeof,但不够(DOM对象是宿主对象,IE8及以下版本中,由COM实现)
基于能力检测进行浏览器分析
使用能力检测而非用户代理检测的优点在于,伪造用户代理字符串狠简单,而伪造能够欺骗检测能力的浏览器特性很难
1.检测特性
如果需要使用特定浏览器能力,最好集中监测所有能力,而非使用时重复检测
2.检测浏览器
根据对浏览器特性的检测和已知特性对比,确定浏览器类型
3.能力检测的局限
通过检测一种或者一组能力,并不能总确定浏览器类型
最适合用于决定下一步操作,不一定能作为浏览器标识
二、用户代理检测
用户代理字符串
包含在HTTP请求的头部
在JavaScript中,用window.navigator.userAgent访问
服务器端,常见的做法是根据收到的用户代理字符串请求,确定何种操作
客户端,userAgent不可靠,因为可以伪造
标记/版本
1.用户代理历史
早期浏览器 mozilla/version [language] (platform;Encryption)
Netscape Navigator 3 and IE3 Mozilla/Version (platform ; Encryption [; OS-or-CPU description])
Netscape Navigator 4 and IE4-8
….
2.浏览器分析
伪造用户代理
分析浏览器
三、软件检测与硬件检测
1.识别浏览器与操作系统
Navigator.oscpu 操作系统、系统架构相关信息
Navigator.vendor 浏览器开发商
Navigator.platform 操作系统
Screen.colorDepth screen.pixelDepth 显示器每像素颜色的位深
Screen.orientation 一个ScreenOrientation对象
2.浏览器元数据
navigator暴露出的一些api
Geolocation API 当前设备的地理位置 getCurrentPosition()
Connection State
浏览器跟踪网络连接状态并通过连接事件或者navigator.onLine属性暴露连接状态;设备联网或者断网时,会在window对象上触发online或者offline事件
NetworkInformation API
提供一些只读属性,并为连接属性变化事件处理程序定义了一个事件对象
Battery Status API
设备电池及充电情况,getBattery()方法返回一个期约实例,解决为一个BatteryManager对象
3.硬件
hardwareConcurrency 逻辑处理器核心数量
deviceMemory 系统内存大小
maxTouchPoints 最大关联触点数