如何检测浏览器的版本?

odl*_*dle 274 javascript browser version browser-detection

我一直在寻找可以让我检测访问该网站的用户是否拥有Firefox 3或4的代码.我发现所有代码都是检测浏览器类型而不是版本.

如何检测这样的浏览器版本?

ken*_*bec 479

您可以看到浏览器有什么,并利用这些信息进行记录或测试多个浏览器.

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+)/g.exec(ua) || [];
        return 'IE '+(tem[1] || '');
    }
    if(M[1]=== 'Chrome'){
        tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
        if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
    }
    M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
    return M.join(' ');
})();

console.log(navigator.sayswho); // outputs: `Chrome 62`
Run Code Online (Sandbox Code Playgroud)

  • 如果这个答案包含输出示例,将会有所帮助.我无法分辨出函数中的字符串. (56认同)
  • 此脚本错误地报告内部Facebook浏览器的浏览器Chrome版本4.0(当您单击Android上的Facebook应用程序中的Web链接时启动).useragent字符串看起来像:`Mozilla/5.0(Linux; Android 5.0; Nexus 9 Build/LRX21R; wv)AppleWebKit/537.36(KHTML,如Gecko)版本/ 4.0 Chrome/45.0.2454.95 Safari/537.36 [FB_IAB/FB4A; FBAV/50.0.0.10.54;]`这是一个非常突出的用户代理,遗憾的是所以不能忽视它... (6认同)
  • 还没有考虑Edge:`tem = ua.match(/\b(OPR|Edge)\/(\d+)/i); if (tem != null) return {name : tem[1] === 'OPR' ? '歌剧':tem[1],版本:tem[2]};` (3认同)
  • 刚刚发现严重问题,将浏览器IE11降级为显示Mozilla/4.0的IE10导航用户代理(兼容; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)来自字符串的IE7与trident/6.0要小心 (2认同)
  • 有些库可以做到这一点,即 Bowser,并且作为一般规则,如果不需要,您不应该重新发明轮子。 (2认同)

Her*_*son 199

这是肯纳贝克答案的改进.

function get_browser() {
    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+)/g.exec(ua) || []; 
        return {name:'IE',version:(tem[1]||'')};
        }   
    if(M[1]==='Chrome'){
        tem=ua.match(/\bOPR|Edge\/(\d+)/)
        if(tem!=null)   {return {name:'Opera', version:tem[1]};}
        }   
    M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);}
    return {
      name: M[0],
      version: M[1]
    };
 }
Run Code Online (Sandbox Code Playgroud)

然后你运行:

var browser=get_browser();
// browser.name = 'Chrome'
// browser.version = '40'
Run Code Online (Sandbox Code Playgroud)

这样你就可以保护自己免受代码的晦涩.


Bra*_*don 51

这结合了肯尼贝克(K)的回答和Hermann Ingjaldsson(H)的回答:

  • 保持原始答案的最小代码.(K)
  • 适用于Microsoft Edge(K)
  • 扩展导航器对象,而不是创建新的变量/对象.(K)
  • 将浏览器版本和名称分隔为独立的子对象.(H)

 

navigator.browserSpecs = (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+)/g.exec(ua) || [];
        return {name:'IE',version:(tem[1] || '')};
    }
    if(M[1]=== 'Chrome'){
        tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
        if(tem != null) return {name:tem[1].replace('OPR', 'Opera'),version:tem[2]};
    }
    M = M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem = ua.match(/version\/(\d+)/i))!= null)
        M.splice(1, 1, tem[1]);
    return {name:M[0], version:M[1]};
})();

console.log(navigator.browserSpecs); //Object { name: "Firefox", version: "42" }

if (navigator.browserSpecs.name == 'Firefox') {
    // Do something for Firefox.
    if (navigator.browserSpecs.version > 42) {
        // Do something for Firefox versions greater than 42.
    }
}
else {
    // Do something for all other browsers.
}
Run Code Online (Sandbox Code Playgroud)


Kyl*_*Mit 32

以下是几个处理浏览器检测的着名库,截至2019年2月.

Bowser by lancedikson - 3,216★s - 最后更新时间:2019年2月9日 - 2.9KB

var result = bowser.getParser(window.navigator.userAgent);
console.log(result);
document.write("You are using " + result.parsedResult.browser.name +
               " v" + result.parsedResult.browser.version + 
               " on " + result.parsedResult.os.name);
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/bowser@2.4.0/es5.js"></script>
Run Code Online (Sandbox Code Playgroud)

Platform.js by bestiejs - 2,250★s - 最后更新时间:2018年10月30日 - 5.9KB

console.log(platform);
document.write("You are using " + platform.name +
               " v" + platform.version + 
               " on " + platform.os);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.5/platform.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

gabceb的jQuery浏览器 - 504★s - 最后更新时间2015年11月23日 - 1.3KB

console.log($.browser)
document.write("You are using " + $.browser.name +
               " v" + $.browser.versionNumber + 
               " on " + $.browser.platform);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-browser/0.1.0/jquery.browser.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

由darcyclarke检测的Detect.js(存档) - 522★s - 最后更新时间2015年10月26日 - 2.9KB

var result = detect.parse(navigator.userAgent);
console.log(result);
document.write("You are using " + result.browser.family +
               " v" + result.browser.version + 
               " on " + result.os.family);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

由QuirksMode进行的浏览器检测(存档) - 最后更新时间为2013年11月14日 - 884B

console.log(BrowserDetect)
document.write("You are using " + BrowserDetect.browser +
               " v" + BrowserDetect.version + 
               " on " + BrowserDetect.OS);
Run Code Online (Sandbox Code Playgroud)
<script src="https://kylemit.github.io/libraries/libraries/BrowserDetect.js"></script>
Run Code Online (Sandbox Code Playgroud)


值得注意的提及:

  • WhichBrowser - 1,355★s - 最后更新时间为2018年10月2日
  • Modernizr - 23,397★s - 最后更新2019年1月12日 - 为了喂养一匹美联储的马,功能检测应该驱动任何canIuse风格的问题.浏览器检测实际上只是为各个浏览器提供自定义图像,下载文件或说明.

进一步阅读


Mic*_*ole 28

库巴 JavaScript库提供了这个功能.

if (bowser.msie && bowser.version <= 6) {
  alert('Hello China');
}
Run Code Online (Sandbox Code Playgroud)

它似乎得到很好的维护.


Oli*_*ran 18

使用此:http://www.quirksmode.org/js/detect.html

alert(BrowserDetect.browser); // will say "Firefox"
alert(BrowserDetect.version); // will say "3" or "4"
Run Code Online (Sandbox Code Playgroud)

  • 过时的引用,不再支持 - "此页面用于包含我自己的浏览器检测脚本,但我发现我没有足够的时间来保持最新状态.因此我删除了它." (7认同)

Dan*_*ski 16

我正在寻找自己的解决方案,因为jQuery 1.9.1及更高版本已经删除了该$.browser功能.我想出了这个对我有用的小功能.它确实需要一个全局变量(我称之为我的_browser)以检查它是哪个浏览器.我写了一个jsfiddle来说明它是如何使用的,当然它可以通过添加_browser.foo的测试来扩展其他浏览器,其中foo是浏览器的名称.我做的只是流行的.

detectBrowser()

_browser = {};

function detectBrowser() {
  var uagent = navigator.userAgent.toLowerCase(),
      match = '';

  _browser.chrome  = /webkit/.test(uagent)  && /chrome/.test(uagent)      &&
                     !/edge/.test(uagent);

  _browser.firefox = /mozilla/.test(uagent) && /firefox/.test(uagent);

  _browser.msie    = /msie/.test(uagent)    || /trident/.test(uagent)     ||
                     /edge/.test(uagent);

  _browser.safari  = /safari/.test(uagent)  && /applewebkit/.test(uagent) &&
                     !/chrome/.test(uagent);

  _browser.opr     = /mozilla/.test(uagent) && /applewebkit/.test(uagent) &&
                     /chrome/.test(uagent)  && /safari/.test(uagent)      &&
                     /opr/.test(uagent);

  _browser.version = '';

  for (x in _browser) {
    if (_browser[x]) {

      match = uagent.match(
                new RegExp("(" + (x === "msie" ? "msie|edge" : x) + ")( |\/)([0-9]+)")
              );

      if (match) {
        _browser.version = match[3];
      } else {
        match = uagent.match(new RegExp("rv:([0-9]+)"));
        _browser.version = match ? match[1] : "";
      }
      break;
    }
  }
  _browser.opera = _browser.opr;
  delete _browser.opr;
}
Run Code Online (Sandbox Code Playgroud)

要检查当前浏览器是否为Opera,您可以这样做

if (_browser.opera) { // Opera specific code }
Run Code Online (Sandbox Code Playgroud)

编辑修复了格式,修复了IE11和Opera/Chrome的检测,从结果更改为browserResult.现在_browser键的顺序无关紧要.更新了jsFiddle链接.

2015/08/11 编辑为Internet Explorer 12(EDGE)添加了新的测试用例,修复了一个小的正则表达式问题.更新了jsFiddle链接.


小智 12

function BrowserCheck()
{
    var N= navigator.appName, ua= navigator.userAgent, tem;
    var M= ua.match(/(opera|chrome|safari|firefox|msie|trident)\/?\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;
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个数组,第一个元素是浏览器名称,第二个元素是字符串格式的完整版本号.


Mar*_*rek 9

jQuery可以处理这个很好的(jQuery.browser)

var ua = $.browser;
if ( ua.mozilla && ua.version.slice(0,3) == "1.9" ) {
    alert( "Do stuff for firefox 3" );
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如约书亚在下面的评论中写道,自1.9版以来,jQuery中不再支持jQuery.browser属性(有关更多详细信息,请阅读jQuery 1.9发行说明).jQuery开发团队建议使用更完整的方法,例如使用Modernizr库调整UI .

  • jQuery 1.9已经删除了$ .browser支持,所以这不再是一个选项. (15认同)

mVC*_*Chr 7

在纯Javascript中,您可以在上面navigator.userAgent找到Firefox版本的RegExp匹配:

var uMatch = navigator.userAgent.match(/Firefox\/(.*)$/),
    ffVersion;
if (uMatch && uMatch.length > 1) {
    ffVersion = uMatch[1];
}
Run Code Online (Sandbox Code Playgroud)

ffVersionundefined如果不是Firefox浏览器将是.

见工作示例→


Yun*_*Han 6

这是 Fzs2 和 kennebec For New Edge Chromium 的更新

function get_browser() {
    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+)/g.exec(ua) || []; 
        return {name:'IE',version:(tem[1]||'')};
        }   
    if(M[1]==='Chrome'){
        tem=ua.match(/\bEdg\/(\d+)/)
        if(tem!=null)   {return {name:'Edge(Chromium)', version:tem[1]};}
        tem=ua.match(/\bOPR\/(\d+)/)
        if(tem!=null)   {return {name:'Opera', version:tem[1]};}
        }   
    M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);}
    return {
      name: M[0],
      version: M[1]
    };
 }

var browser=get_browser(); // browser.name = 'Edge(Chromium)'
                           // browser.version = '86'

console.log(browser);
Run Code Online (Sandbox Code Playgroud)


Ry-*_*Ry- 5

navigator.userAgent-Firefox/xxx.xxx.xxx在最后指定。


Ank*_*kit 5

检测浏览器及其版本

此代码片段基于MDN的文章。他们给出了有关可用于检测浏览器名称的各种关键字的简短提示。

参考

我做了一些更改来检测EdgeUCBrowser等浏览器

getBrowser = () => {
    const userAgent = navigator.userAgent;
    let browser = "unkown";
    // Detect browser name
    browser = (/ucbrowser/i).test(userAgent) ? 'UCBrowser' : browser;
    browser = (/edg/i).test(userAgent) ? 'Edge' : browser;
    browser = (/googlebot/i).test(userAgent) ? 'GoogleBot' : browser;
    browser = (/chromium/i).test(userAgent) ? 'Chromium' : browser;
    browser = (/firefox|fxios/i).test(userAgent) && !(/seamonkey/i).test(userAgent) ? 'Firefox' : browser;
    browser = (/; msie|trident/i).test(userAgent) && !(/ucbrowser/i).test(userAgent) ? 'IE' : browser;
    browser = (/chrome|crios/i).test(userAgent) && !(/opr|opera|chromium|edg|ucbrowser|googlebot/i).test(userAgent) ? 'Chrome' : browser;;
    browser = (/safari/i).test(userAgent) && !(/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i).test(userAgent) ? 'Safari' : browser;
    browser = (/opr|opera/i).test(userAgent) ? 'Opera' : browser;

    // detect browser version
    switch (browser) {
        case 'UCBrowser': return `${browser}/${browserVersion(userAgent,/(ucbrowser)\/([\d\.]+)/i)}`;
        case 'Edge': return `${browser}/${browserVersion(userAgent,/(edge|edga|edgios|edg)\/([\d\.]+)/i)}`;
        case 'GoogleBot': return `${browser}/${browserVersion(userAgent,/(googlebot)\/([\d\.]+)/i)}`;
        case 'Chromium': return `${browser}/${browserVersion(userAgent,/(chromium)\/([\d\.]+)/i)}`;
        case 'Firefox': return `${browser}/${browserVersion(userAgent,/(firefox|fxios)\/([\d\.]+)/i)}`;
        case 'Chrome': return `${browser}/${browserVersion(userAgent,/(chrome|crios)\/([\d\.]+)/i)}`;
        case 'Safari': return `${browser}/${browserVersion(userAgent,/(safari)\/([\d\.]+)/i)}`;
        case 'Opera': return `${browser}/${browserVersion(userAgent,/(opera|opr)\/([\d\.]+)/i)}`;
        case 'IE': const version = browserVersion(userAgent,/(trident)\/([\d\.]+)/i);
            // IE version is mapped using trident version 
            // IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0
            return version ? `${browser}/${parseFloat(version) + 4.0}` : `${browser}/7.0`;
        default: return `unknown/0.0.0.0`;
    }
}

browserVersion = (userAgent,regex) => {
    return userAgent.match(regex) ? userAgent.match(regex)[2] : null;
}

console.log(getBrowser());
Run Code Online (Sandbox Code Playgroud)