关于javascript:如何检测浏览器的版本?

How can you detect the version of a browser?

我一直在四处搜索代码,以检测访问该网站的用户是否拥有火狐3或4。我找到的只是检测浏览器类型的代码,而不是版本。

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


您可以看到浏览器所说的内容,并使用这些信息记录或测试多个浏览器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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`


这是对Kennebec答案的改进。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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]
    };
 }

然后你就跑:

1
2
3
var browser=get_browser();
// browser.name = 'Chrome'
// browser.version = '40'

这样你就可以保护自己不受代码的蒙蔽。


这结合了Kennebec的(k)答案和Hermann Ingjaldsson的(h)答案:

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

nbsp;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.
}


bowser javascript库提供了这个功能。

1
2
3
if (bowser.msie && bowser.version <= 6) {
  alert('Hello China');
}

它似乎保养得很好。


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

1
2
alert(BrowserDetect.browser); // will say"Firefox"
alert(BrowserDetect.version); // will say"3" or"4"


从2019年5月起,这里有几个处理浏览器检测的著名库。

Bowser by Lanedikson-3761S-最新更新日期:2019年5月26日-4.8KB

1
2
3
4
5
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);
1
<script src="https://unpkg.com/[email protected]/es5.js">

*基于铬的支撑边缘

platform.js by bestiejs-2250s-最新更新日期:2018年10月30日-5.9kb

1
2
3
4
console.log(platform);
document.write("You are using" + platform.name +
              " v" + platform.version +
              " on" + platform.os);
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.5/platform.min.js">

jquery browser by gabceb-504s-上次更新日期:2015年11月23日-1.3kb

1
2
3
4
console.log($.browser)
document.write("You are using" + $.browser.name +
              " v" + $.browser.versionNumber +
              " on" + $.browser.platform);

1
2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-browser/0.1.0/jquery.browser.min.js">

Detect.js(存档)作者:Darcyclarke-522S-上次更新时间:2015年10月26日-2.9kb

1
2
3
4
5
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);

1
<script src="https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.min.js">

浏览器检测(存档)由QuirksMode-上次更新于2013年11月14日-884b

1
2
3
4
console.log(BrowserDetect)
document.write("You are using" + BrowserDetect.browser +
              " v" + BrowserDetect.version +
              " on" + BrowserDetect.OS);

1
<script src="https://kylemit.github.io/libraries/libraries/BrowserDetect.js">

值得注意的是:

  • whichbrowser-1355s-最新更新日期:2018年10月2日
  • 现代化——23397S——上一次更新于2019年1月12日——为了喂饲马,功能检测应该会引发任何犬类风格的问题。浏览器检测实际上只是为单个浏览器提供定制的图像、下载文件或说明。

进一步阅读

  • 栈溢出-浏览器在javascript中检测?
  • 堆栈溢出-如何检测Safari、Chrome、IE、Firefox和Opera浏览器?


我在为自己寻找解决方案,因为jquery 1.9.1及更高版本已经删除了$.browser功能。我想出了一个适合我的小功能。它确实需要一个全局变量(我称之为mine-u浏览器)来检查它是哪个浏览器。我已经编写了一个JSfiddle来说明如何使用它,当然,它可以通过添加一个test for browser.foo来扩展到其他浏览器,其中foo是浏览器的名称。我只做了流行的。

检测浏览器()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
_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;
}

检查当前浏览器是否为Opera

1
if (_browser.opera) { // Opera specific code }

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

2015/08/11编辑为Internet Explorer 12(Edge)添加了新的测试用例,修复了一个小的regexp问题。更新了jsFiddle链接。


1
2
3
4
5
6
7
8
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;
}

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


jquery可以很好地处理这个问题(jquery.browser)

1
2
3
4
var ua = $.browser;
if ( ua.mozilla && ua.version.slice(0,3) =="1.9" ) {
    alert("Do stuff for firefox 3" );
}

编辑:正如Joshua在下面的评论中所写,jquery.browser属性自1.9版以来不再受jquery的支持(有关详细信息,请阅读jquery 1.9发行说明)。jquery开发团队建议使用更完整的方法,如将UI与现代化库相适应。


在纯javascript中,您可以在navigator.userAgent上进行regexp匹配,以找到火狐版本:

1
2
3
4
5
var uMatch = navigator.userAgent.match(/Firefox\/(.*)$/),
    ffVersion;
if (uMatch && uMatch.length > 1) {
    ffVersion = uMatch[1];
}

如果不是火狐浏览器,ffVersion将是undefined

见工作示例&x2192;


看一看navigator.userAgentFirefox/xxx.xxx.xxx是在末尾指定的。


1
2
3
<script type="text/javascript">
var version = navigator.appVersion;
alert(version);


我写了一个版本检测器,它基于HermanIngjaldsson的答案,但是更健壮,它返回一个包含名称/版本数据的对象。它涵盖了主要的浏览器,但我不担心过多的移动浏览器和次要浏览器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function getBrowserData(nav) {
    var data = {};

    var ua = data.uaString = nav.userAgent;
    var browserMatch = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*([\d\.]+)/i) || [];
    if (browserMatch[1]) { browserMatch[1] = browserMatch[1].toLowerCase(); }
    var operaMatch = browserMatch[1] === 'chrome';
    if (operaMatch) { operaMatch = ua.match(/\bOPR\/([\d\.]+)/); }

    if (/trident/i.test(browserMatch[1])) {
        var msieMatch = /\brv[ :]+([\d\.]+)/g.exec(ua) || [];
        data.name = 'msie';
        data.version = msieMatch[1];
    }
    else if (operaMatch) {
        data.name = 'opera';
        data.version = operaMatch[1];
    }
    else if (browserMatch[1] === 'safari') {
        var safariVersionMatch = ua.match(/version\/([\d\.]+)/i);
        data.name = 'safari';
        data.version = safariVersionMatch[1];
    }
    else {
        data.name = browserMatch[1];
        data.version = browserMatch[2];
    }

    var versionParts = [];
    if (data.version) {
        var versionPartsMatch = data.version.match(/(\d+)/g) || [];
        for (var i=0; i < versionPartsMatch.length; i++) {
            versionParts.push(versionPartsMatch[i]);
        }
        if (versionParts.length > 0) { data.majorVersion = versionParts[0]; }
    }
    data.name = data.name || '(unknown browser name)';
    data.version = {
        full: data.version || '(unknown full browser version)',
        parts: versionParts,
        major: versionParts.length > 0 ? versionParts[0] : '(unknown major browser version)'
    };

    return data;
};

然后可以这样使用:

1
2
3
4
var brData = getBrowserData(window.navigator || navigator);
console.log('name: ' + brData.name);
console.log('major version: ' + brData.version.major);
// etc.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browserName  = navigator.appName;
var fullVersion  = ''+parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion,10);
var nameOffset,verOffset,ix;

// In Opera, the true version is after"Opera" or after"Version"

if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
 browserName ="Opera";
 fullVersion = nAgt.substring(verOffset+6);
 if ((verOffset=nAgt.indexOf("Version"))!=-1)
   fullVersion = nAgt.substring(verOffset+8);
}
// In MSIE, the true version is after"MSIE" in userAgent

else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
 browserName ="Microsoft Internet Explorer";
 fullVersion = nAgt.substring(verOffset+5);
}
// In Chrome, the true version is after"Chrome"

else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) {
 browserName ="Chrome";
 fullVersion = nAgt.substring(verOffset+7);
}
// In Safari, the true version is after"Safari" or after"Version"

else if ((verOffset=nAgt.indexOf("Safari"))!=-1) {
 browserName ="Safari";
 fullVersion = nAgt.substring(verOffset+7);
 if ((verOffset=nAgt.indexOf("Version"))!=-1)
   fullVersion = nAgt.substring(verOffset+8);
}
// In Firefox, the true version is after"Firefox"

else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) {
 browserName ="Firefox";
 fullVersion = nAgt.substring(verOffset+8);
}
// In most other browsers,"name/version" is at the end of userAgent

else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) <
          (verOffset=nAgt.lastIndexOf('/')) )
{
 browserName = nAgt.substring(nameOffset,verOffset);
 fullVersion = nAgt.substring(verOffset+1);
 if (browserName.toLowerCase()==browserName.toUpperCase()) {
  browserName = navigator.appName;
 }
}

// trim the fullVersion string at semicolon/space if present

if ((ix=fullVersion.indexOf(";"))!=-1)
   fullVersion=fullVersion.substring(0,ix);
if ((ix=fullVersion.indexOf(""))!=-1)
   fullVersion=fullVersion.substring(0,ix);

majorVersion = parseInt(''+fullVersion,10);
if (isNaN(majorVersion)) {
 fullVersion  = ''+parseFloat(navigator.appVersion);
 majorVersion = parseInt(navigator.appVersion,10);
}

document.write(''
 +'Browser name  = '+browserName+''
 +'Full version  = '+fullVersion+''
 +'Major version = '+majorVersion+''
 +'navigator.appName = '+navigator.appName+''
 +'navigator.userAgent = '+navigator.userAgent+''
)

请参阅这里的演示。…http://jsfiddle.net/hw4jm/3/


这个页面似乎有一个非常好的代码片段,它只使用appstring和appversion属性作为最后的手段,因为它声称它们在某些浏览器中不可靠。页面上的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browserName  = navigator.appName;
var fullVersion  = ''+parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion,10);
var nameOffset,verOffset,ix;

// In Opera 15+, the true version is after"OPR/"
if ((verOffset=nAgt.indexOf("OPR/"))!=-1) {
 browserName ="Opera";
 fullVersion = nAgt.substring(verOffset+4);
}
// In older Opera, the true version is after"Opera" or after"Version"
else if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
 browserName ="Opera";
 fullVersion = nAgt.substring(verOffset+6);
 if ((verOffset=nAgt.indexOf("Version"))!=-1)
   fullVersion = nAgt.substring(verOffset+8);
}
// In MSIE, the true version is after"MSIE" in userAgent
else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
 browserName ="Microsoft Internet Explorer";
 fullVersion = nAgt.substring(verOffset+5);
}
// In Chrome, the true version is after"Chrome"
else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) {
 browserName ="Chrome";
 fullVersion = nAgt.substring(verOffset+7);
}
// In Safari, the true version is after"Safari" or after"Version"
else if ((verOffset=nAgt.indexOf("Safari"))!=-1) {
 browserName ="Safari";
 fullVersion = nAgt.substring(verOffset+7);
 if ((verOffset=nAgt.indexOf("Version"))!=-1)
   fullVersion = nAgt.substring(verOffset+8);
}
// In Firefox, the true version is after"Firefox"
else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) {
 browserName ="Firefox";
 fullVersion = nAgt.substring(verOffset+8);
}
// In most other browsers,"name/version" is at the end of userAgent
else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) <
          (verOffset=nAgt.lastIndexOf('/')) )
{
 browserName = nAgt.substring(nameOffset,verOffset);
 fullVersion = nAgt.substring(verOffset+1);
 if (browserName.toLowerCase()==browserName.toUpperCase()) {
  browserName = navigator.appName;
 }
}
// trim the fullVersion string at semicolon/space if present
if ((ix=fullVersion.indexOf(";"))!=-1)
   fullVersion=fullVersion.substring(0,ix);
if ((ix=fullVersion.indexOf(""))!=-1)
   fullVersion=fullVersion.substring(0,ix);

majorVersion = parseInt(''+fullVersion,10);
if (isNaN(majorVersion)) {
 fullVersion  = ''+parseFloat(navigator.appVersion);
 majorVersion = parseInt(navigator.appVersion,10);
}

document.write(''
 +'Browser name  = '+browserName+''
 +'Full version  = '+fullVersion+''
 +'Major version = '+majorVersion+''
 +'navigator.appName = '+navigator.appName+''
 +'navigator.userAgent = '+navigator.userAgent+''
)


我用ASP代码编写了一个脚本来检测浏览器、浏览器版本、操作系统和操作系统版本。我在ASP中这样做的原因是因为我想将数据存储在日志数据库中。所以我必须检测浏览器服务器端。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
on error resume next
ua = lcase(Request.ServerVariables("HTTP_USER_AGENT"))
moz = instr(ua,"mozilla")  
ffx = instr(ua,"firefox")  
saf = instr(ua,"safari")
crm = instr(ua,"chrome")
max = instr(ua,"maxthon")
opr = instr(ua,"opera")
ie4 = instr(ua,"msie 4")
ie5 = instr(ua,"msie 5")
ie6 = instr(ua,"msie 6")
ie7 = instr(ua,"msie 7")
ie8 = instr(ua,"trident/4.0")
ie9 = instr(ua,"trident/5.0")

if moz>0 then
    BrowserType ="Mozilla"
    BrVer = mid(ua,moz+8,(instr(moz,ua,"")-(moz+8)))
end if
if ffx>0 then
    BrowserType ="FireFox"
    BrVer = mid(ua,ffx+8)
end if
if saf>0 then
    BrowserType ="Safari"
    BrVerPlass = instr(ua,"version")
    BrVer = mid(ua,BrVerPlass+8,(instr(BrVerPlass,ua,"")-(BrVerPlass+8)))
end if
if crm>0 then
    BrowserType ="Chrome"
    BrVer = mid(ua,crm+7,(instr(crm,ua,"")-(crm+7)))
end if
if max>0 then
    BrowserType ="Maxthon"
    BrVer = mid(ua,max+8,(instr(max,ua,"")-(max+8)))
end if
if opr>0 then
    BrowserType ="Opera"
    BrVerPlass = instr(ua,"presto")
    BrVer = mid(ua,BrVerPlass+7,(instr(BrVerPlass,ua,"")-(BrVerPlass+7)))
end if
if ie4>0 then
    BrowserType ="Internet Explorer"
    BrVer ="4"
end if
if ie5>0 then
    BrowserType ="Internet Explorer"
    BrVer ="5"
end if
if ie6>0 then
    BrowserType ="Internet Explorer"
    BrVer ="6"
end if
if ie7>0 then
    BrowserType ="Internet Explorer"
    BrVer ="7"
end if
if ie8>0 then
    BrowserType ="Internet Explorer"
    BrVer ="8"
    if ie7>0 then BrVer = BrVer &" (in IE7 compability mode)"
end if
if ie9>0 then
    BrowserType ="Internet Explorer"
    BrVer ="9"
    if ie7>0 then BrVer = BrVer &" (in IE7 compability mode)"
    if ie8>0 then BrVer = BrVer &" (in IE8 compability mode)"
end if

OSSel = mid(ua,instr(ua,"(")+1,(instr(ua,";")-instr(ua,"("))-1)
OSver = mid(ua,instr(ua,";")+1,(instr(ua,")")-instr(ua,";"))-1)

if BrowserType ="Internet Explorer" then
    OSStart = instr(ua,";")
    OSStart = instr(OSStart+1,ua,";")        
    OSStopp = instr(OSStart+1,ua,";")
    OSsel = mid(ua,OSStart+2,(OSStopp-OSStart)-2)
end if

    Select case OSsel
        case"windows nt 6.1"
            OS ="Windows"
            OSver ="7"
        case"windows nt 6.0"
            OS ="Windows"
            OSver ="Vista"
        case"windows nt 5.2"
            OS ="Windows"
            OSver ="Srv 2003 / XP x64"
        case"windows nt 5.1"
            OS ="Windows"
            OSver ="XP"
        case else
            OS = OSSel
    End select

Response.write"" & ua &"" & BrowserType &"" & BrVer &"" & OS &"" & OSver &""

'Use the variables here for whatever you need........


添加我自己对赫尔曼答案的实现。我需要操作系统检测,所以已经添加了。还包括一些ES6代码(因为我们有一个蒸腾器),您可能需要ES5验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
detectClient() {
    let nav = navigator.appVersion,
        os = 'unknown',
        client = (() => {
            let agent = navigator.userAgent,
                engine = agent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [],
                build;

            if(/trident/i.test(engine[1])){
                build = /\brv[ :]+(\d+)/g.exec(agent) || [];
                return {browser:'IE', version:(build[1] || '')};
            }

            if(engine[1] === 'Chrome'){
                build = agent.match(/\bOPR\/(\d+)/);

                if(build !== null) {
                    return {browser: 'Opera', version: build[1]};
                }
            }

            engine = engine[2] ? [engine[1], engine[2]] : [navigator.appName, nav, '-?'];

            if((build = agent.match(/version\/(\d+)/i)) !== null) {
                engine.splice(1, 1, build[1]);
            }

            return {
              browser: engine[0],
              version: engine[1]
            };
        })();

    switch (true) {
        case nav.indexOf('Win') > -1:
            os = 'Windows';
        break;
        case nav.indexOf('Mac') > -1:
            os = 'MacOS';
        break;
        case nav.indexOf('X11') > -1:
            os = 'UNIX';
        break;
        case nav.indexOf('Linux') > -1:
            os = 'Linux';
        break;
    }        

    client.os = os;
    return client;
}

返回:Object {browser:"Chrome", version:"50", os:"UNIX"}


我使用它来获取实际浏览器版本的de name和number(int):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function getInfoBrowser() {
    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: 'Explorer', version: parseInt((tem[1] || '')) };
    }
    if (M[1] === 'Chrome') {
        tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
        if (tem != null) { let app = tem.slice(1).toString().split(','); return { name: app[0].replace('OPR', 'Opera'), version: parseInt(app[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: parseInt(M[1])
    };
}

function getBrowser(){
  let info = getInfoBrowser();
  $("#i-name").html(info.name);
  $("#i-version").html(info.version);
}
1
2
3
4
5
6
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">

<input type="button" onclick="getBrowser();" value="Get Info Browser"/>
<hr/>
Name: <span id="i-name"></span><br/>
Version: <span id="i-version"></span>

这次磨合

chrome;firefox;safari;Internet Explorer(>=9);opera;edge

为了我。


这里的兼容性比@kennebec snippet好;将返回浏览器名称和版本(返回72而不是72.0.3626.96)。

在Safari、Chrome、Opera、Firefox、IE、Edge、UCBrowser以及移动设备上测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function browser() {
    var userAgent = navigator.userAgent,
        match = userAgent.match(/(opera|chrome|crios|safari|ucbrowser|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [],
        result = {},
        tem;

    if (/trident/i.test(match[1])) {
        tem = /\brv[ :]+(\d+)/g.exec(userAgent) || [];
        result.name ="Internet Explorer";
    } else if (match[1] ==="Chrome") {
        tem = userAgent.match(/\b(OPR|Edge)\/(\d+)/);

        if (tem && tem[1]) {
            result.name = tem[0].indexOf("Edge") === 0 ?"Edge" :"Opera";
        }
    }
    if (!result.name) {
        tem = userAgent.match(/version\/(\d+)/i); // iOS support
        result.name = match[0].replace(/\/.*/,"");

        if (result.name.indexOf("MSIE") === 0) {
            result.name ="Internet Explorer";
        }
        if (userAgent.match("CriOS")) {
            result.name ="Chrome";
        }

    }
    if (tem && tem.length) {
        match[match.length - 1] = tem[tem.length - 1];
    }

    result.version = Number(match[match.length - 1]);

    return result;
}


下面是Java版本的SOMMONE,它希望使用EDCOX1(7)返回的字符串在服务器端进行它。

它正在处理我用于测试的70种不同的浏览器配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static String decodeBrowser(String userAgent) {
    userAgent= userAgent.toLowerCase();
    String name ="unknown";
    String version ="0.0";
    Matcher userAgentMatcher = USER_AGENT_MATCHING_PATTERN.matcher(userAgent);
    if (userAgentMatcher.find()) {
      name = userAgentMatcher.group(1);
      version = userAgentMatcher.group(2);
      if ("trident".equals(name)) {
        name ="msie";
        Matcher tridentVersionMatcher = TRIDENT_MATCHING_PATTERN.matcher(userAgent);
        if (tridentVersionMatcher.find()) {
          version = tridentVersionMatcher.group(1);
        }
      }
    }
    return name +"" + version;
  }

  private static final Pattern USER_AGENT_MATCHING_PATTERN=Pattern.compile("(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*([\\d\\.]+)");
  private static final Pattern TRIDENT_MATCHING_PATTERN=Pattern.compile("\\brv[ :]+(\\d+(\\.\\d+)?)");


我写这个是为了我的需要。

它得到的信息就像是一个移动设备或者视网膜显示器

试试看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
var nav = {
        isMobile:function(){
            return (navigator.userAgent.match(/iPhone|iPad|iPod|Android|BlackBerry|Opera Mini|IEMobile/i) != null);
        },
        isDesktop:function(){
            return (navigator.userAgent.match(/iPhone|iPad|iPod|Android|BlackBerry|Opera Mini|IEMobile/i) == null);
        },
        isAndroid: function() {
            return navigator.userAgent.match(/Android/i);
        },
        isBlackBerry: function() {
            return navigator.userAgent.match(/BlackBerry/i);
        },
        isIOS: function() {
            return navigator.userAgent.match(/iPhone|iPad|iPod/i);
        },
        isOpera: function() {
            return navigator.userAgent.match(/Opera Mini/i);
        },
        isWindows: function() {
            return navigator.userAgent.match(/IEMobile/i);
        },
        isRetina:function(){
            return window.devicePixelRatio && window.devicePixelRatio > 1;
        },
        isIPad:function(){
            isIPad = (/ipad/gi).test(navigator.platform);
            return isIPad;
        },
        isLandscape:function(){
            if(window.innerHeight < window.innerWidth){
                return true;
            }
            return false;
        },
        getIOSVersion:function(){
            if(this.isIOS()){
                var OSVersion = navigator.appVersion.match(/OS (\d+_\d+)/i);
                OSVersion = OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0;
                return OSVersion;
            }
            else
                return false;
        },
        isStandAlone:function(){
            if(_.is(navigator.standalone))
                return navigator.standalone;
            return false;
        },
        isChrome:function(){
            var isChrome = (/Chrome/gi).test(navigator.appVersion);
            var isSafari = (/Safari/gi).test(navigator.appVersion)
            return isChrome && isSafari;
        },
        isSafari:function(){
            var isSafari = (/Safari/gi).test(navigator.appVersion)
            var isChrome = (/Chrome/gi).test(navigator.appVersion)
            return !isChrome && isSafari;
        }
}


1
2
3
4
var ua = navigator.userAgent;

if (/Firefox\//.test(ua))
   var Firefox = /Firefox\/([0-9\.A-z]+)/.exec(ua)[1];

我想分享我为必须解决的问题编写的代码。它在大多数主要浏览器中都经过了测试,对我来说,它的工作方式很有魅力!

这段代码似乎与其他答案非常相似,但它经过了修改,以便我可以使用jquery中浏览器对象的insted,而jquery最近对我来说是一个遗漏,当然这是上述代码的组合,对我的部分做了一些改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(function($, ua){

var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [],
    tem,
    res;

if(/trident/i.test(M[1])){
    tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
    res = 'IE ' + (tem[1] || '');
}
else if(M[1] === 'Chrome'){
    tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
    if(tem != null)
        res = tem.slice(1).join(' ').replace('OPR', 'Opera');
    else
        res = [M[1], M[2]];
}
else {
    M = M[2]? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
    if((tem = ua.match(/version\/(\d+)/i)) != null) M = M.splice(1, 1, tem[1]);
    res = M;
}

res = typeof res === 'string'? res.split(' ') : res;

$.browser = {
    name: res[0],
    version: res[1],
    msie: /msie|ie/i.test(res[0]),
    firefox: /firefox/i.test(res[0]),
    opera: /opera/i.test(res[0]),
    chrome: /chrome/i.test(res[0]),
    edge: /edge/i.test(res[0])
}

})(typeof jQuery != 'undefined'? jQuery : window.$, navigator.userAgent);

 console.log($.browser.name, $.browser.version, $.browser.msie);
// if IE 11 output is: IE 11 true


对于任何使用Angular的PWA应用程序,您可以将代码放入index.html的body部分,以检查浏览器是否受支持。-

1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
   
   
        var operabrowser = true;
        operabrowser = (navigator.userAgent.indexOf('Opera Mini') > -1);
        if (operabrowser) {
            txt ="<p>
Browser not supported use different browser...
</p>"
;
            document.getElementById("browser").innerHTML = txt;
        }
   
</body>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browserName = navigator.appName;
var fullVersion = '' + parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion, 10);
var nameOffset, verOffset, ix;

// In Opera 15+, the true version is after"OPR/"
if ((verOffset = nAgt.indexOf("OPR/")) != -1) {
    browserName ="Opera";
    fullVersion = nAgt.substring(verOffset + 4);
}
// In older Opera, the true version is after"Opera" or after"Version"
else if ((verOffset = nAgt.indexOf("Opera")) != -1) {
    browserName ="Opera";
    fullVersion = nAgt.substring(verOffset + 6);
    if ((verOffset = nAgt.indexOf("Version")) != -1)
        fullVersion = nAgt.substring(verOffset + 8);
}
// In MSIE, the true version is after"MSIE" in userAgent
else if ((verOffset = nAgt.indexOf("MSIE")) != -1) {
    browserName ="Microsoft Internet Explorer";
    fullVersion = nAgt.substring(verOffset + 5);
}
// In Chrome, the true version is after"Chrome"
else if ((verOffset = nAgt.indexOf("Chrome")) != -1) {
    browserName ="Google Chrome";
    fullVersion = nAgt.substring(verOffset + 7);
}
// In Safari, the true version is after"Safari" or after"Version"
else if ((verOffset = nAgt.indexOf("Safari")) != -1) {
    browserName ="Safari";
    fullVersion = nAgt.substring(verOffset + 7);
    if ((verOffset = nAgt.indexOf("Version")) != -1)
        fullVersion = nAgt.substring(verOffset + 8);
}
// In Firefox, the true version is after"Firefox"
else if ((verOffset = nAgt.indexOf("Firefox")) != -1) {
    browserName ="Mozilla Firefox";
    fullVersion = nAgt.substring(verOffset + 8);
}
// In most other browsers,"name/version" is at the end of userAgent
else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
    browserName = nAgt.substring(nameOffset, verOffset);
    fullVersion = nAgt.substring(verOffset + 1);
    if (browserName.toLowerCase() == browserName.toUpperCase()) {
        browserName = navigator.appName;
    }
}
// trim the fullVersion string at semicolon/space if present
if ((ix = fullVersion.indexOf(';')) != -1) fullVersion = fullVersion.substring(0, ix);
if ((ix = fullVersion.indexOf(' ')) != -1) fullVersion = fullVersion.substring(0, ix);

majorVersion = parseInt('' + fullVersion, 10);
if (isNaN(majorVersion)) {
    fullVersion = '' + parseFloat(navigator.appVersion);
    majorVersion = parseInt(navigator.appVersion, 10);
}