是否有一种方法可以从背景脚本中获取浏览器信息,包括版本号



我希望从背景脚本中有关浏览器的当前平台信息。

Firefox具有指定键versionruntime.getBrowserInfo函数。

缺少必须导入软件包或将用户代理字符串等级授予,是否有类似的优雅方式来利用Chrome Extension API?

简短答案

使用navigator.vendor不是navigator.userAgent。不好,但这是最好的选择。UA是不可靠的,并且经常变化。在供应商中寻找:

  • " Google"在Chrome浏览器中
  • "苹果"在Safari浏览器中
  • "; quot"(空(在Firefox
  • 不确定IE/Edge,确认其他人的值

供应商已弃用,但在仍然存在的时候是一个更好的解决方案。一旦知道浏览器,就可以尝试从navigator.useragent中选择适当的版本号(在其他任何地方都不存在版本信息(。只需提防如果UA已更改UA(由用户,供应商,其他任何人(可能是错误的。

确保您确实需要浏览器检测而不是功能检测。

长答案

解析用户词字符串(即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?这可以追溯到Netscape Navigator统治栖息的栖息地时,它可以回到网络的开头(90年代初(。Netscape的内部名称是Mozilla。此后,每个浏览器都在模仿Netscape Navigator,这是一个已死20年以上的浏览器。它继续进行:Chrome还模仿Apple Safari和Khtml。

将毫无疑问地添加其他人。

它变得更糟

,但比这更糟糕。除了模拟其他浏览器外,用户式字符串完全可以改变。用户可以将UA字符串设置为所需的任何内容。这通常是为了安全性(WebServers的隐藏平台详细信息(,隐私(防止窥探(或避免管理不良的服务器限制(向其他UAS显示不同的内容(。UA甚至可以在相同的浏览器之间在站点之间变化,并具有以每位点设置UA的扩展名。

解析UA是一场灾难。在基本未修饰的情况下,它只是在某种程度上起作用 - 直到情况发生变化并且一切都破裂为止。浏览器制造商一直在更新其UA字符串,但不能保证一致性。错误地识别浏览器可能会导致很难诊断的奇怪错误。

您可能会说"那呢?我正在写扩展名。是否另一个扩展名更改某些站点的UA都没关系。我的背景脚本看到了真正的UA。你会错的。

  1. 用户可以并且确实在其配置文件中设置了用户代理字符串。在加载任何扩展之前,这些都会在浏览器范围内生效
  2. 您的扩展内容脚本可能看不到真实的UA。背景和内容脚本之间的这种不匹配会为您的扩展程序带来头痛。可以勤奋管理,但要处理的痛苦。

最好的方法

当前,诊断浏览器的最佳方法是使用navigator.vendor。为什么?

  1. 供应商不是HTTP请求中发送的标题的一部分。这意味着...
  2. 供应商对网站进行检查的可能性要小得多(只能使用脚本来完成客户端(,这意味着...
  3. 用户更改供应商字符串的动力要少得多,而他们这样做的方式有限

Firefox未设置供应商。Chrome将其设置为" Google Inc."。Safari将其设置为" Apple Computer,Inc。"。值可能会略有变化,但检查" Apple"的子字符串匹配项或" Google"或空是安全的。

不确定边缘/IE与供应商有什么关系。也许有人可以在评论中发布它。

您可以在控制台中看到导航器中的所有字符串:

for (p in navigator) { value = navigator [p]; if (typeof value == 'string') { console.log ('' + p + ' = ' + value); } }

最新更新