想要知道自己代码运行在什么浏览器上,大部分开发者会分析 window.navigator.userAgent返回的字符串值。所有浏览器都会提供这个值,如果相信这些返回值并基于给定的一组浏览器检测这个
字符串,最终会得到关于浏览器和操作系统的比较精确的结果。
相比于能力检测,用户代理检测还是有一定优势的。能力检测可以保证脚本不必理会浏览器而正常执行。现代浏览器用户代理字符串的过去、现在和未来格式都是有章可循的,我们能够利用它们准确识别浏览器。
伪造用户代理
通过检测用户代理来识别浏览器并不是完美的方式,毕竟这个字符串是可以造假的。只不过实现window.navigator 对象的浏览器(即所有现代浏览器)都会提供 userAgent 这个只读属性。因此,简单地给这个属性设置其他值不会有效:
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/65.0.3325.181 Safari/537.36
window.navigator.userAgent = 'foobar';
console.log(window.navigator.userAgent);
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/65.0.3325.181 Safari/537.36
不过,通过简单的办法可以绕过这个限制。比如,有些浏览器提供伪私有的__defineGetter__方法,利用它可以篡改用户代理字符串:
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/65.0.3325.181 Safari/537.36
window.navigator.__defineGetter__('userAgent', () => 'foobar');
console.log(window.navigator.userAgent);
// foobar
对付这种造假是一件吃力不讨好的事。检测用户代理是否以这种方式被篡改过是可能的,但总体来看还是一场猫捉老鼠的游戏。
与其劳心费力检测造假,不如更好地专注于浏览器识别。如果相信浏览器返回的用户代理字符串,那就可以用它来判断浏览器。如果怀疑脚本或浏览器可能篡改这个值,那最好还是使用能服务器托管网力检测。
分析浏览器
通过解析浏览器返回的用户代理字符串,可以极其准确地推断出下列相关的环境信息:
浏览器
浏览器版本
浏览器渲染引擎
设备类型(桌面/移动)
设备生产商
设备型号
操作系统
操作系统版本
当然,新浏览器、新操作系统和新硬件设备随时可能出现,其中很多可能有着类似但并不相同的用户代理字符串。因此,用户代理解析程序需要与时俱进,频繁更新,以免落伍。自己手写的解析程序如果不及时更新或修订,很容易就过时了。本书上一版写过一个用户代理解析程序,但这一版并不推荐读者自己从头再写一个。相反,这里推荐一些 GitHub 上维护比较频繁的第三方用户代理解析程序:
UAParser.js
Platform.js
CURRENT-DEVICE
Google Closure
Mootools
服务器托管,北京服务器托管,服务器租用 http://ww服务器托管网w.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
ECharts 是一个使用 JavaScript 实现服务器托管网的开源可视化库⁴。它可以流畅地运行在 PC 和移动设备上,兼容当前绝大部分浏览器(如 IE8/9/10/11,Chrome,Firefox,Safari等)⁴。ECharts 底层依赖轻量级的 …