【问题标题】:How can I reliably detect the browser without using window.navigator?如何在不使用 window.navigator 的情况下可靠地检测浏览器?
【发布时间】:2014-11-23 00:07:59
【问题描述】:

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

首先,澄清一下,我不需要知道渲染引擎,这不是用于自适应布局的,不要惊慌:我已经在做特征检测了。如果为什么我问的是检测浏览器很重要,请发表评论,我很乐意解释,但这可能会使问题过长。

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

  • Browser detection in Javascript? 因为19 个答案中,有 12 个专门使用 navigator.userAgent(包括使用的 jQuery.browser userAgent,现在已经消失了),4 使用 navigator.appName(在 Chrome 中给出“Netscape”...),1 通过推荐功能回避问题检测,这与浏览器检测不同(我已经在使用特征检测,但是要知道我可以使用它们的程度,我需要浏览器检测),并且 2 不是真正的答案或者是特定于 IE。 (虽然this non-answer 实际上非常解释为什么我的问题是相关的:我试图避免在某些浏览器上遇到会导致标签崩溃的痛点!)因为我的问题是要求答案(甚至是黑客攻击?)不使用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 相关联,我需要了解浏览器,而不是渲染引擎。

希望这很清楚。

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

【问题讨论】:

  • @meager 你读过我的问题吗?除了用户代理之外,还有哪些其他方式可以检测到浏览器类型?请重新打开问题。
  • 所有这些问题都有非 UA 答案。
  • ... window.navigator 实际上算作一个用户代理字符串——我在这里试图避免这种情况。
  • 那么为什么不运行一些示例 JavaScript 来实际估计性能,而不仅仅是提供预定义的估计值。您提出的方法可能经不起时间的考验。这并没有说明您将忽略的浏览器版本之间的差异:Firefox ESR 版本、Chrome 稳定版/Canary、您不考虑的浏览器(如 Midori)和根本不是浏览器的脚本引擎(如 nodejs/V8)。

标签: javascript cross-browser user-agent


【解决方案1】:

一个想法:

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

如果你把 moz、ms 和 chrome-object 结合起来,你可以嗅出三个最大的浏览器。

附带说明,特征检测仍然是最好的选择,不是针对 OP,而是针对 “我刚刚开始编程并且我喜欢知道 -我是如何嗅出浏览器程序员的”

【讨论】:

  • 是的!这些是我正在寻找的黑客!谢谢你。我将尝试这些想法。
【解决方案2】:

首先,要明确的是,没有任何入站 HTTP 请求可以保证准确地说明他们是谁。事实上,这就是一些黑客通过伪造 HTTP 标头的 User-Agent 字段来进行操作的方式。大多数浏览器提供商;但是,通过在入站 HTTP 请求标头的 User-agent 字段中这样说来很好地识别他们是谁。在 Javascript 层工作的唯一问题是它的一层太高而无法看到标题。但是有一些技巧,这里是其中之一:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

我在稍微考虑了这个问题并且非常了解网络方面后发现了这个......你可以在这里阅读更多关于这个的信息:Accessing the web page's HTTP Headers in JavaScript,事实上这个问题可以被认为是那个答案的重复,但是,不是每个人都知道 HTTP 层。上面的代码假装是一个合法的入站请求,并使用“Get”打开 document.location,但它什么也没发送。在不知道浏览器内部结构的情况下,我猜测是 DOM 本身返回了已知的标头信息。只需解析他响应的 User-Agent 部分即可。

【讨论】:

  • 你说得对,User-Agent 并不是检测浏览器的可靠方法;这是我想避免它的原因之一。 (请参阅msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx)虽然是一个非常聪明的解决方案的道具——我从来没有想过这个!
  • 感谢您发布链接,我已经看到了“Edge”的东西,但不知道它是什么(直到现在)。祝您在寻找解决方案时好运。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 2011-01-16
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2021-01-13
相关资源
最近更新 更多