【问题标题】:What is a RELIABLE way to detect a client's browser and its version number?检测客户端浏览器及其版本号的可靠方法是什么?
【发布时间】:2014-02-18 22:12:12
【问题描述】:

检测某人的浏览器及其版本号的可靠方法是什么?据我所见,JavaScript 中的 navigator 对象之类的东西根本无法达到这个目的,而且我遇到的很多这些真正被破解的解决方案也没有。我遇到的一两个当前功能 JavaScript 代码 sn-ps 会告诉我是否有人在使用 Firefox、Chrome 等,但它们没有描述每个浏览器的版本号。如何找到它,如何可靠地完成它? (前端是几个 Flex 应用程序。)

编辑

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

编辑

我知道这个问题已被问过一百万次,但我遇到的答案,包括 Stack Overflow 上接受的答案,要么不起作用,要么效果不够好,无法使用。这就是为什么我要强调“可靠”这个词。阻碍的一件事是,在许多代码 sn-ps 中,您会看到“Netscape”出现而不是“Internet Explorer”等。

例如,“Internet Explorer 11”、“Firefox 26”等。或者至少是类似的东西。

以下是一些效果不佳的代码 sn-ps 示例:

流行,但我尝试时它不会运行:

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 对象在这类事情上存在很多问题。

【问题讨论】:

  • Detect version of browser 的可能重复项
  • 它可靠吗?浏览器可以发送它(甚至可能是用户)想要的任何字符串。
  • 如果它可以在至少 Chrome、Firefox 和 IE(希望 Safari 和 Opera)的远程现代版本中运行,那就足够了。不过可能仍然很复杂。
  • 你提到你发现的一些东西不起作用,还有一些工作。你需要展示什么实际上不工作,什么是工作。否则你会让人推荐你已经尝试过的东西(就像第一个评论者所做的那样)。

标签: javascript asp.net browser actionscript scripting


【解决方案1】:

没有可靠的方法来执行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 上运行,那么你可能想要发布一些关于如何实现这一点的进一步说明。

【讨论】:

猜你喜欢
  • 2012-11-26
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多