我想从后台脚本获取有关浏览器的当前平台信息。
Firefox 有一个
runtime.getBrowserInfo
函数,可以指定一个键 version
。
除了必须导入包或正则表达式用户代理字符串之外,是否有类似的优雅方法来利用 chrome 扩展 API?
使用
navigator.vendor
而不是 navigator.userAgent
。不是很好,但这是最好的选择。 UA 不可靠并且经常变化。在供应商中寻找:
供应商已被弃用,但它仍然存在,这是一个更好的解决方案。一旦您了解了浏览器,您可以尝试从 navigator.userAgent 中挑选适当的版本号(版本信息在其他任何地方都不存在)。请注意,如果 UA 被更改(由用户、供应商或其他任何人更改),版本可能会出现严重错误。
确保您确实需要浏览器检测而不是功能检测。
解析 UserAgent 字符串(即 navigator.userAgent)是一种糟糕的方法。用户代理(UA)是建立在谎言之上的。看看这个默认的chrome UA:
Mozilla/5.0 (Macintosh; Intel Mac OS X 31_32_33) AppleWebKit/456.78 (KHTML, like Gecko) Chrome/196.0.0.0 Safari/456.78
Chrome 立即开始模仿 Mozilla、WebKit、KHTML 和 Safari。为什么是 Mozilla?这可以追溯到网络诞生之初(90 年代初),当时 Netscape Navigator 称霸。 Netscape 的内部名称是 Mozilla。此后的每个浏览器都在模仿 Netscape Navigator,该浏览器已经消亡 20 多年了。事情还在继续:chrome 还模仿 Apple Safari 和 KHTML。将来无疑会添加其他内容。
但情况比这更糟糕。除了模拟其他浏览器之外,UserAgent 字符串是完全可以更改的。用户可以将 UA 字符串设置为他们想要的任何内容。这样做通常是为了安全(向网络服务器隐藏平台详细信息)、隐私(防止窥探)或避免管理不善的服务器限制(向不同的 UA 显示不同的内容)。 UA 甚至可以在同一个浏览器中因站点而异,通过在每个站点上设置 UA 的扩展。
解析 UA 是一场灾难。它只在基本未修改的情况下起作用 - 直到事情发生变化并且一切都崩溃了。浏览器制造商一直在更新他们的 UA 字符串,但不能保证一致性。错误地识别浏览器可能会导致难以诊断的奇怪错误。
您可能会说“那又怎样?我正在编写一个扩展。另一个扩展是否更改某些站点的 UA 并不重要。我的后台脚本看到了真正的 UA”。你就错了。
navigator.vendor
。为什么?
Firefox 不设置供应商。 Chrome 将其设置为“Google Inc.” Safari 将其设置为“Apple Computer, Inc.”。值可能会略有变化,但检查“Apple”或“Google”的子字符串匹配或空是安全的。
不确定 Edge / IE 与供应商做什么。也许有人可以在评论中发布。
您可以在控制台中看到导航器中的所有字符串:
for (p in navigator) { value = navigator [p]; if (typeof value == 'string') { console.log ('' + p + ' = ' + value); } }