How to detect Safari, Chrome, IE, Firefox and Opera browser?
我有5个附加组件/扩展,用于FF、Chrome、IE、Opera和Safari。
如何识别用户浏览器并重定向(单击安装按钮后)以下载相应的插件?
搜索浏览器可靠的检测通常会导致检查用户代理字符串。这个方法不可靠,因为欺骗这个值很简单。我已经编写了一种方法,通过duck输入检测浏览器。
只有在确实需要时才使用浏览器检测方法,例如显示特定于浏览器的安装扩展的说明。尽可能使用功能检测。
演示:https://jsfiddle.net/6spj1059/
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 | // Opera 8.0+ var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; // Firefox 1.0+ var isFirefox = typeof InstallTrigger !== 'undefined'; // Safari 3.0+"[object HTMLElementConstructor]" var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() ==="[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification)); // Internet Explorer 6-11 var isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; // Chrome 1 - 71 var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime); // Blink engine detection var isBlink = (isChrome || isOpera) && !!window.CSS; var output = 'Detecting browsers by ducktyping:'; output += 'isFirefox: ' + isFirefox + ''; output += 'isChrome: ' + isChrome + ''; output += 'isSafari: ' + isSafari + ''; output += 'isOpera: ' + isOpera + ''; output += 'isIE: ' + isIE + ''; output += 'isEdge: ' + isEdge + ''; output += 'isBlink: ' + isBlink + ''; document.body.innerHTML = output; |
前面的方法依赖渲染引擎(
- Internet Explorer:JScript的条件编译(直到IE9)和
document.documentMode 。 - Edge:在Trident和Edge浏览器中,微软的实现公开了
StyleMedia 构造函数。排除三叉戟让我们有了优势。 - firefox:firefox安装附加组件的API:
InstallTrigger - chrome:全局
chrome 对象,包含多个属性,包括文档化的chrome.webstore 对象。- 更新3
chrome.webstore 在最新版本中已被否决和未定义。
- 更新3
- Safari:一种独特的命名模式,用于命名构造函数。这是所有列出的属性中最不耐用的方法,你猜怎么着?在Safari 9.1.3中,它被修复。因此,我们正在检查版本7.1之后引入的
SafariRemoteNotification ,以涵盖3.0及以上版本的所有Safaris。 - Opera:
window.opera 已经存在多年了,但是当Opera用Blink+V8(铬合金使用)取代其发动机时,它将被放弃。- 更新1:Opera15已经发布,它的UA字符串看起来像Chrome,但是添加了"opr"。在这个版本中,定义了
chrome 对象(但没有定义chrome.webstore )。因为Opera很难克隆Chrome,所以我使用了用户代理嗅探。 - 更新2:
!!window.opr && opr.addons 可用于检测opera 20+(常绿)。
- 更新1:Opera15已经发布,它的UA字符串看起来像Chrome,但是添加了"opr"。在这个版本中,定义了
- blink:Google打开Chrome28后,在blink中引入了
CSS.supports() 。当然,这和歌剧中使用的眨眼是一样的。
成功测试于:
- 火狐0.8-61
- 铬1 - 71
- 歌剧8 - 34
- 狩猎3 - 10
- IE 6—11
- 边缘-20 42
Updated in November 2016 to include detection of Safari browsers from 9.1.3 and upwards
Updated in August 2018 to update the latest successful tests on chrome, firefox IE and edge.
Updated in January 2019 to fix chrome detection (because of the window.chrome.webstore depreciation) and include the latest successful tests on chrome.
您可以尝试以下方法检查浏览器版本。
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 | <!DOCTYPE html> <html> <body> <p> What is the name(s) of your browser? </p> <button onclick="myFunction()">Try it</button> <p id="demo"> </p> function myFunction() { if((navigator.userAgent.indexOf("Opera") || navigator.userAgent.indexOf('OPR')) != -1 ) { alert('Opera'); } else if(navigator.userAgent.indexOf("Chrome") != -1 ) { alert('Chrome'); } else if(navigator.userAgent.indexOf("Safari") != -1) { alert('Safari'); } else if(navigator.userAgent.indexOf("Firefox") != -1 ) { alert('Firefox'); } else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10 { alert('IE'); } else { alert('unknown'); } } </body> </html> |
如果你只需要知道IE浏览器的版本,那么你可以遵循下面的代码。此代码适用于版本IE6到IE11
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 | <!DOCTYPE html> <html> <body> <p> Click on Try button to check IE Browser version. </p> <button onclick="getInternetExplorerVersion()">Try it</button> <p id="demo"> </p> function getInternetExplorerVersion() { var ua = window.navigator.userAgent; var msie = ua.indexOf("MSIE"); var rv = -1; if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number { if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) { //For IE 11 > if (navigator.appName == 'Netscape') { var ua = navigator.userAgent; var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})"); if (re.exec(ua) != null) { rv = parseFloat(RegExp.$1); alert(rv); } } else { alert('otherbrowser'); } } else { //For < IE11 alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)))); } return false; }} </body> </html> |
我知道使用lib可能有点过分,但是为了丰富线程,您可以检查is.js执行此操作的方式:
4如果有人发现这很有用,我将rob w的答案转换成一个函数,返回浏览器字符串,而不是让多个变量到处浮动。由于浏览器在不重新加载的情况下也不能真正地进行更改,所以我让它缓存结果,以防止下次调用函数时它需要进行处理。
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 | /** * Gets the browser name or returns an empty string if unknown. * This function also caches the result to provide for any * future calls this function has. * * @returns {string} */ var browser = function() { // Return cached result if avalible, else get result then cache it. if (browser.prototype._cachedResult) return browser.prototype._cachedResult; // Opera 8.0+ var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; // Firefox 1.0+ var isFirefox = typeof InstallTrigger !== 'undefined'; // Safari 3.0+"[object HTMLElementConstructor]" var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() ==="[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification); // Internet Explorer 6-11 var isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; // Chrome 1+ var isChrome = !!window.chrome && !!window.chrome.webstore; // Blink engine detection var isBlink = (isChrome || isOpera) && !!window.CSS; return browser.prototype._cachedResult = isOpera ? 'Opera' : isFirefox ? 'Firefox' : isSafari ? 'Safari' : isChrome ? 'Chrome' : isIE ? 'IE' : isEdge ? 'Edge' : isBlink ? 'Blink' : "Don't know"; }; console.log(browser()); |
从2019年5月起,这里有几个处理浏览器检测的著名库。
Bowser by Lanedikson-3761S-最新更新日期:2019年5月26日-4.8KB4
1 | <script src="https://unpkg.com/bowser@2.4.0/es5.js"> |
*基于铬的支撑边缘
platform.js by bestiejs-2250s-最新更新日期:2018年10月30日-5.9kb1 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"> |
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"> |
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"> |
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中检测?
- 堆栈溢出-如何检测浏览器的版本?
以下是Rob答案的2016年调整版本,包括Microsoft Edge和Blink检测:
(编辑:我用这些信息更新了罗布的回答。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera) isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; // Firefox 1.0+ isFirefox = typeof InstallTrigger !== 'undefined'; // Safari 3.0+ isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() ==="[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification); // Internet Explorer 6-11 isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ isEdge = !isIE && !!window.StyleMedia; // Chrome 1+ isChrome = !!window.chrome && !!window.chrome.webstore; // Blink engine detection isBlink = (isChrome || isOpera) && !!window.CSS; /* Results: */ console.log("isOpera", isOpera); console.log("isFirefox", isFirefox); console.log("isSafari", isSafari); console.log("isIE", isIE); console.log("isEdge", isEdge); console.log("isChrome", isChrome); console.log("isBlink", isBlink); |
这种方法的优点在于它依赖于浏览器引擎属性,因此它甚至覆盖了衍生浏览器,如Yandex或Vivaldi,这些浏览器实际上与它们使用的引擎的主要浏览器兼容。例外情况是Opera,它依赖于用户代理嗅探,但现在(即,ver)。15岁及以上)即使是歌剧本身也只是眨眼的贝壳。
谢谢大家。我在最近的浏览器上测试了这些代码片段:Chrome55、FireFox50、IE11和Edge 38,我想出了以下组合,这些组合对我所有的浏览器都有效。我相信它可以改进,但对于任何需要的人来说,它是一个快速的解决方案:
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 | var browser_name = ''; isIE = /*@cc_on!@*/false || !!document.documentMode; isEdge = !isIE && !!window.StyleMedia; if(navigator.userAgent.indexOf("Chrome") != -1 && !isEdge) { browser_name = 'chrome'; } else if(navigator.userAgent.indexOf("Safari") != -1 && !isEdge) { browser_name = 'safari'; } else if(navigator.userAgent.indexOf("Firefox") != -1 ) { browser_name = 'firefox'; } else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10 { browser_name = 'ie'; } else if(isEdge) { browser_name = 'edge'; } else { browser_name = 'other-browser'; } $('html').addClass(browser_name); |
它在HTML中添加了一个带有浏览器名称的CSS类。
短变型
1 2 3 4 5 6 7 8 9 10 11 12 | var browser = (function(agent){ switch(true){ case agent.indexOf("edge") > -1: return"edge"; case agent.indexOf("opr") > -1 && !!window.opr: return"opera"; case agent.indexOf("chrome") > -1 && !!window.chrome: return"chrome"; case agent.indexOf("trident") > -1: return"ie"; case agent.indexOf("firefox") > -1: return"firefox"; case agent.indexOf("safari") > -1: return"safari"; default: return"other"; } })(window.navigator.userAgent.toLowerCase()); console.log(browser) |
您可以使用
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 | var getBrowser = function() { try { var e; var f = e.width; } catch(e) { var err = e.toString(); if(err.indexOf("not an object") !== -1) { return"safari"; } else if(err.indexOf("Cannot read") !== -1) { return"chrome"; } else if(err.indexOf("e is undefined") !== -1) { return"firefox"; } else if(err.indexOf("Unable to get property 'width' of undefined or null reference") !== -1) { if(!(false || !!document.documentMode) && !!window.StyleMedia) { return"edge"; } else { return"IE"; } } else if(err.indexOf("cannot convert e into object") !== -1) { return"opera"; } else { return undefined; } } }; |
还有一种不太"黑客"的方法,适用于所有流行的浏览器。谷歌在他们的关闭库中包含了一个浏览器检查。特别是看一下
如果需要知道某个特定浏览器的数字版本,可以使用以下代码段。目前它会告诉你Chrome/Chromium/Firefox的版本:
1 2 | var match = $window.navigator.userAgent.match(/(?:Chrom(?:e|ium)|Firefox)\/([0-9]+)\./); var ver = match ? parseInt(match[1], 10) : 0; |
不知道它是否对任何人有用,但这里有一个变体可以让typescript高兴。
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 | export function getBrowser() { // Opera 8.0+ if ((!!window["opr"] && !!["opr"]["addons"]) || !!window["opera"] || navigator.userAgent.indexOf(' OPR/') >= 0) { return 'opera'; } // Firefox 1.0+ if (typeof window["InstallTrigger"] !== 'undefined') { return 'firefox'; } // Safari 3.0+"[object HTMLElementConstructor]" if (/constructor/i.test(window["HTMLElement"]) || (function(p) { return p.toString() ==="[object SafariRemoteNotification]"; })(!window['safari'] || (typeof window["safari"] !== 'undefined' && window["safari"].pushNotification))) { return 'safari'; } // Internet Explorer 6-11 if (/*@cc_on!@*/false || !!document["documentMode"]) { return 'ie'; } // Edge 20+ if (!(/*@cc_on!@*/false || !!document["documentMode"]) && !!window["StyleMedia"]) { return 'edge'; } // Chrome 1+ if (!!window["chrome"] && !!window["chrome"].webstore) { return 'chrome'; } // Blink engine detection if (((!!window["chrome"] && !!window["chrome"].webstore) || ((!!window["opr"] && !!["opr"]["addons"]) || !!window["opera"] || navigator.userAgent.indexOf(' OPR/') >= 0)) && !!window["CSS"]) { return 'blink'; } |
}
在桌面和移动设备上检测浏览器:Edge、Opera、Chrome、Safari、Firefox、IE
I did some changes in @nimesh code now it is working for Edge also,
and Opera issue fixed:
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 | function getBrowserName() { if ( navigator.userAgent.indexOf("Edge") > -1 && navigator.appVersion.indexOf('Edge') > -1 ) { return 'Edge'; } else if( navigator.userAgent.indexOf("Opera") != -1 || navigator.userAgent.indexOf('OPR') != -1 ) { return 'Opera'; } else if( navigator.userAgent.indexOf("Chrome") != -1 ) { return 'Chrome'; } else if( navigator.userAgent.indexOf("Safari") != -1) { return 'Safari'; } else if( navigator.userAgent.indexOf("Firefox") != -1 ) { return 'Firefox'; } else if( ( navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true ) ) //IF IE > 10 { return 'IE'; } else { return 'unknown'; } } |
谢谢@nimesh用户:2063564
UAParser是一个轻量级的JavaScript库,用于从用户代理字符串中标识浏览器、引擎、操作系统、CPU和设备类型/模型。
有可用的cdn。这里,我包含了一个使用UAParser检测浏览器的示例代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!doctype html> <html> <head> <script src="https://cdn.jsdelivr.net/npm/ua-parser-js@0/dist/ua-parser.min.js"> <script type="text/javascript"> var parser = new UAParser(); var result = parser.getResult(); console.log(result.browser); // {name:"Chromium", version:"15.0.874.106"} </head> <body> </body> </html> |
现在,您可以使用
源教程:如何使用javascript检测浏览器、引擎、操作系统、CPU和设备?
1 2 | const isChrome = /Chrome/.test(navigator.userAgent) const isFirefox = /Firefox/.test(navigator.userAgent) |
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 | var BrowserDetect = { init: function () { this.browser = this.searchString(this.dataBrowser) ||"Other"; this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) ||"Unknown"; }, searchString: function (data) { for (var i = 0; i < data.length; i++) { var dataString = data[i].string; this.versionSearchString = data[i].subString; if (dataString.indexOf(data[i].subString) !== -1) { return data[i].identity; } } }, searchVersion: function (dataString) { var index = dataString.indexOf(this.versionSearchString); if (index === -1) { return; } var rv = dataString.indexOf("rv:"); if (this.versionSearchString ==="Trident" && rv !== -1) { return parseFloat(dataString.substring(rv + 3)); } else { return parseFloat(dataString.substring(index + this.versionSearchString.length + 1)); } }, dataBrowser: [ {string: navigator.userAgent, subString:"Edge", identity:"MS Edge <hr> <p> Here you find out which browser is it running. </p> [cc lang="javascript"]function isValidBrowser(navigator){ var isChrome = navigator.indexOf('chrome'), isFireFox= navigator.indexOf('firefox'), isIE = navigator.indexOf('trident') , isValidChromeVer = parseInt(navigator.substring(isChrome+7, isChrome+8)) >= 4, isValidFireForVer = parseInt(navigator.substring(isFireFox+8, isFireFox+9)) >= 3, isValidIEVer = parseInt(navigator.substring(isIE+8, isIE+9)) >= 7; if((isChrome > -1 && isValidChromeVer){ console.log("Chrome Browser")} if(isFireFox > -1 && isValidFireForVer){ console.log("FireFox Browser")} if(isIE > -1 && isValidIEVer)){ console.log("IE Browser")} } |
这结合了Rob的原始答案和Pilau对2016年的更新。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; // Chrome 1+ var output = 'Detecting browsers by ducktyping:'; output += 'isFirefox: ' + isFirefox + ''; output += 'isChrome: ' + isChrome + ''; output += 'isSafari: ' + isSafari + ''; output += 'isOpera: ' + isOpera + ''; output += 'isIE: ' + isIE + ''; output += 'isIE Edge: ' + isEdge + ''; document.body.innerHTML = output; |
我们可以使用下面的实用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | utils.isIE = function () { var ver = navigator.userAgent; return ver.indexOf("MSIE") !== -1 || ver.indexOf("Trident") !== -1; // need to check for Trident for IE11 }; utils.isIE32 = function () { return (utils.isIE() && navigator.appVersion.indexOf('Win64') === -1); }; utils.isChrome = function () { return (window.chrome); }; utils.isFF64 = function () { var agent = navigator.userAgent; return (agent.indexOf('Win64') >= 0 && agent.indexOf('Firefox') >= 0); }; utils.isFirefox = function () { return (navigator.userAgent.toLowerCase().indexOf('firefox') > -1); }; |
简单的一行javascript代码将为您提供浏览器名称:
1 2 3 4 | function GetBrowser() { return navigator ? navigator.userAgent.toLowerCase() :"other"; } |