什么是可靠的方法来检测客户端的浏览器及其版本号?

时间:2014-01-27 21:02:40

标签: javascript asp.net browser actionscript scripting

检测某人浏览器及其版本号的可靠方法是什么?从我所看到的情况来看,像JavaScript中的navigator对象这样的东西根本就不能用于此目的,而且我遇到的很多这些解决方案也没有真正被黑客攻击。我遇到过一个或两个当前正在运行的JavaScript代码片段,它会告诉我某人是否正在使用Firefox,Chrome等,但他们没有描述每个浏览器的版本号。如何找到它,如何可靠地完成? (前端是两个Flex应用程序。)

修改

这个问题与一个非常相似的问题有关,建议我应该只能在那里使用答案。我不能;它不适用于未知原因。在我之前的编辑中,下面的那个,我发布的第一个例子来自另一个问题。请删除此链接。感谢。

修改

我知道这个问题已被问过一百万次了,但是我遇到的答案,包括Stack Overflow上接受的答案,或者只是不起作用或者不能很好地使用。这就是我强调“可靠”这个词的原因。阻碍的一点是,在很多代码片段中,你会看到“Netscape”而不是“Internet Explorer”等。

例如,“Internet Explorer 11”,“Firefox 26”等。或者至少是那种接近它的东西。

以下是一些代码片段的例子:

很受欢迎,但是当我尝试它时它不会运行:

navigator.sayswho= (function(){
    var ua= navigator.userAgent, tem, 
    M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*([\d\.]+)/i) || [];
    if(/trident/i.test(M[1])){
        tem=  /\brv[ :]+(\d+(\.\d+)?)/g.exec(ua) || [];
        return 'IE '+(tem[1] || '');
    }
    M= M[2]? [M[1], M[2]]:[navigator.appName, navigator.appVersion, '-?'];
    if((tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
    return M.join(' ');
})();

适用于Firefox,但是说IE是Netscape,在描述版本时会给出非常复杂的结果:

function get_browser(){
    var N=navigator.appName, ua=navigator.userAgent, tem;
    var M=ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
    M=M? [M[1], M[2]]: [N, navigator.appVersion, '-?'];
    return M[0];
}
function get_browser_version(){
    var N=navigator.appName, ua=navigator.userAgent, tem;
    var M=ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) M[2]= tem[1];
    M=M? [M[1], M[2]]: [N, navigator.appVersion, '-?'];
    return M[1];
}

alert(get_browser())
alert(get_browser_version())

这几乎是我的需要;只要它不需要任何最新版本,我只需要版本号:

var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined';   // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera;              // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6

给出字符串的东西:

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko

对于IE11或称为Firefox和IE“Netscape”并不是我想要的。 JavaScript中的navigator对象在这方面存在很多问题。

1 个答案:

答案 0 :(得分:2)

没有可靠的方法来执行browser sniffing。我最好的建议是看看WhichBrowser - 权力问题http://html5test.com/

  

每个人都在说谎 - House M.D。

     

这是一个非常复杂且几乎完全没用的浏览器嗅探库。没用,因为你不应该使用浏览器嗅探。所以现在就停下来,去看看有关功能检测的内容。我是认真的。走开。你以后会感谢我。

     

但为什么几乎完全没用而且没有完全无用?

     

嗯,规则总是有例外。进行浏览器嗅探有一个正当理由:收集有关您网站上使用的浏览器的信息。我的网站是html5test.com,我想知道哪个分数属于哪个浏览器。要做到这一点,你需要一个浏览器嗅探库。

     

为什么它非常复杂?

     

因为每个人都撒谎。说真的,没有一个浏览器是完全真实的。几乎所有的浏览器都说它们是Netscape 5,几乎所有的WebKit浏览器都说它们基于Gecko。甚至Internet Explorer 11现在也不再声称是IE,而是一个像Gecko一样的未命名浏览器。它变得更糟。这就是为什么它很复杂。

     

该库的主要部分在服务器上运行并查看浏览器发送的标题,但它也从浏览器本身收集各种数据。它首先看到的是用户代理标头,但还有更多标头包含有关浏览器标识的线索。一旦服务器找到浏览器的标识,它就会查看来自浏览器本身的数据并检查一些其他特征,并尝试确定标题是否可能存在。然后它会给你结果。

有关安装/要求的说明

  

如何安装

     

将文件放在服务器上的目录中。服务器应该能够处理PHP并且包含一个.htaccess文件,该文件指示服务器也使用PHP来解析detect.js文件。这是必需的,如果您的服务器不支持.htaccess文件,您需要找到一种方法让您的服务器执行相同的操作。

帮助您了解IIS而不是apache

的注释

Translate .htaccess Content to IIS web.config

如果你让它在IIS上工作,那么你可能想要发布一些关于如何实现这一点的进一步说明。