我知道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是以供应商为前缀的,但对于在商业产品中使用它似乎不是一个好主意,尽管如果需要我愿意屈服于那么低。还有其他可能性吗?
答案 0 :(得分:5)
一个想法:
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部分即可。