检测某人浏览器及其版本号的可靠方法是什么?从我所看到的情况来看,像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
对象在这方面存在很多问题。
答案 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文件,您需要找到一种方法让您的服务器执行相同的操作。
Translate .htaccess Content to IIS web.config
如果你让它在IIS上工作,那么你可能想要发布一些关于如何实现这一点的进一步说明。