javascript - 如何在不使用 window.navigator 的情况下可靠地检测浏览器?

标签 javascript cross-browser user-agent

我知道 Stack Overflow 上有上千个关于使用 JavaScript 检测浏览器的问题。我的问题是如何在没有 window.navigator(包括 navigator.userAgent)的情况下检测浏览器?

首先,澄清一下,我不需要了解渲染引擎,这不是针对自适应布局的,不要 panic :我已经在进行特征检测了。如果为什么我问的关于检测浏览器的问题很重要,请发表评论,我很乐意拼接解释,但这可能会使问题变得异常冗长。

接下来,让我描述一下为什么我的问题不是重复的:

  • Browser detection in Javascript? 因为 19 个答案,其中 12 专门使用了 navigator.userAgent(包括 jQuery.browser 使用 userAgent,现在已经不存在了),4 使用 navigator.appName(在 Chrome 中给出“Netscape”...),1 通过推荐功能检测来回避问题,这与浏览器检测不同(我已经在使用功能检测,但要知道我可以使用它们的程度,我需要浏览器检测),并且 2 不是真正的答案或特定于 IE。 (虽然 this non-answer 实际上很好地解释了为什么我的问题在这里是相关的:我试图避免在某些浏览器上遇到会导致选项卡崩溃的痛点!)因为我的问题是寻求答案(甚至是 hack?)不使用 window.navigator,它不是那个问题的副本。

  • Check if the user is using IE 因为 11 个答案中,有 10 个使用 navigator.userAgent,其中 1 个使用 IE 技巧来仅检测 IE,这不足以回答我的问题(尽管它可能是可能是此处发布的有用解决方案的一小部分)?

  • In Javascript, how do I determine if my current browser is Firefox on a computer vs everything else? 因为在 11 个答案中,8 个使用 navigator.userAgent,2 个推荐特征检测(同样,这不是我的问题),1 个甚至不是答案,真的。

  • How to detect chrome and safari browser (webkit) 因为8 个答案,其中 6 个使用 navigator.userAgent,2 个是特定于 webkit 的。不幸的是,WebKit 不一定只与 Safari 绑定(bind),我需要了解浏览器,而不是渲染引擎。

希望这很清楚。

我知道还有其他方法可以做到这一点,但我不太了解每个浏览器的来龙去脉。在某些浏览器中,是否存在一致或可靠地暴露给 JavaScript 的对象或变量?我知道一些实验性 API 是 vendor 前缀的,但这似乎不是用于商业产品的好主意,尽管如果需要我愿意降低那么低。还有其他可能吗?

最佳答案

一个想法:

  • IE 使用 ActiveX(仍然使用到 IE11,旧版),您可以通过查看 activeX 可用性相当容易地推断出用户正在使用 IE,但是如果安全设置已启用,您需要依靠,猜猜看,其他特征检测。
  • Chrome 和 Firefox 都支持使用扩展,也许检测这些扩展会有所帮助
  • Chrome 在全局范围内提供了 window['chrome']['webstore'] 对象。
  • 您可以使用 Object.keys 对窗口对象进行排序,并查找 vendor 特定名称,例如 'moz''ms''o'.

如果结合使用 moz、ms 和 chrome-object,您可以找出三个最大的浏览器。

附带说明一下,功能检测仍然是最佳选择,不是针对 OP,而是针对 “我刚刚开始编程并且我想知道-我如何嗅出浏览器程序员”

关于javascript - 如何在不使用 window.navigator 的情况下可靠地检测浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27084036/

相关文章:

javascript - JQuery .animate() 仅适用于 Chrome

html - Internet Explorer 和跨浏览器中的音频

perl - OCSP resolve_blocking() 和 LWP::UserAgent

android - 对于 http 连接中的任何设备,dalvik 代理 header 是否唯一?

php - 检查电报是否正在获取链接数据(用户代理是电报)

javascript - 在 Javascript 中对三维数组进行排序

javascript - 如何在 Ember.js 中重复资源

css - 内联样式元素跨浏览器具有不同的水平间距

javascript - ng 单击 ListItem 和辅助按钮

javascript - 一个标记名,多个属性 - 使用过滤器或使用多个选择器来更快地阻止查询?