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

时间:2014-11-23 00:08:00

标签: javascript cross-browser user-agent

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

首先,为了澄清,我不需要知道渲染引擎,这不适用于自适应布局,并且不要惊慌:我已经在进行特征检测。如果为什么我询问有关检测浏览器的问题很重要,请发表评论,我很乐意拼凑出解释,但这可能会让问题变得非常长。

接下来,让我来说明为什么我的问题不是重复的:

  • Browser detection in Javascript? 19 答案,其中 12 具体使用navigator.userAgent(包括{ {1}}使用了userAgent,现在已经消失了), 4 使用jQuery.browser(在Chrome中提供" Netscape"), 1 通过推荐功能检测来解决问题,这与浏览器检测不同(我已经在使用功能检测,但要知道我可以使用它们的程度,我需要浏览器检测),并且 2 并非真正回答或是IE特定的。 (虽然this non-answer实际上非常清楚地解释了为什么我的问题在这里是相关的:我试图避免在某些浏览器上遇到会使标签崩溃的痛点!)因为我的问题是要求答案(甚至黑客?)没有使用navigator.appName,它不是那个问题的副本。

  • Check if the user is using IE 因为的11个答案,10个使用window.navigator,其中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是以供应商为前缀的,但对于在商业产品中使用它似乎不是一个好主意,尽管如果需要我愿意屈服于那么低。还有其他可能性吗?

2 个答案:

答案 0 :(得分:5)

一个想法:

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

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

另一方面,功能检测仍然是最佳选择,不适用于OP,但对于“我刚刚进入编程 - 我喜欢知道 - 我怎么嗅出了一个浏览器程序员“在那里。

答案 1 :(得分:5)

首先,要明确没有入站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部分即可。