16 ответов:
Googling для надежного обнаружения браузера часто приводит к проверке строки агента пользователя. Этот метод не надежный, потому что это тривиально, чтобы обмануть это значение.
Я написал метод для обнаружения браузеров утка-типирование.используйте метод обнаружения браузера только в том случае, если это действительно необходимо, например, чтобы показать инструкции по установке расширения для конкретного браузера. используйте функцию обнаружения, когда вероятный.
демо: https://jsfiddle.net/311aLtkz/
// 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+ var isChrome = !!window.chrome && !!window.chrome.webstore; // Blink engine detection var isBlink = (isChrome || isOpera) && !!window.CSS;анализ надежности
The предыдущий метод зависит от свойств рендеринга (
-moz-box-sizingи-webkit-transform) для обнаружения браузера. Эти префиксы в конечном итоге будут отброшены, поэтому, чтобы сделать обнаружение еще более надежным, я переключился на характеристики браузера:
- Internet Explorer: JScript-это условная компиляция (до IE9) и
document.documentMode.- Edge: в браузерах Trident и Edge реализация Microsoft предоставляет
StyleMediaконструктор. Исключая трезубец оставляет нас с краем.- Firefox: API Firefox для установки дополнений:
InstallTrigger- Chrome: The global
chromeобъект, содержащий несколько свойств, включая документированныйchrome.webstoreобъект.- Safari: уникальный шаблон именования в его именовании конструкторов. Это наименее долговечный способ из всех перечисленных свойств и угадайте, что? В Safari 9.1.3 это было исправлено. Поэтому мы проверяем против
SafariRemoteNotification, который был введен после версии 7.1, чтобы покрыть все сафари от 3.0 и выше.- Опера:
window.operaсуществует уже много лет, но будут удалены когда Opera заменяет свой двигатель на Blink + V8 (используется Chromium).
- обновление 1: Опера 15 была выпущена, его строка UA выглядит как Chrome, но с добавлением "OPR". В этой версии
chromeобъект определен (ноchrome.webstoreнет). Поскольку Opera пытается клонировать Chrome, я использую для этой цели User agent sniffing.- обновление 2:
!!window.opr && opr.addonsможет использоваться для обнаружения Opera 20+ (вечнозеленые).- Блинк:
CSS.supports()был введен в Blink один раз Google включил Chrome 28. Это, конечно, то же самое мигание, которое используется в опере.успешно протестирован в:
- Firefox 0.8-61
- Chrome 1.0-68
- Opera 8.0-34
- Safari 3.0-10
- т. е. 6 - 11
- края - 20-42
Обновлено в ноябре 2016 года, чтобы включить обнаружение браузеров Safari от 9.1.3 и выше
обновление в Август 2018 для обновления последних успешных тестов на chrome, firefox IE и edge.
вы можете попробовать следующий способ, чтобы проверить версию браузера.
<!DOCTYPE html> <html> <body> <p>What is the name(s) of your browser?</p> <button onclick="myFunction()">Try it</button> <p id="demo"></p> <script> 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'); } } </script> </body> </html>и если вам нужно знать только версию браузера IE, то вы можете следовать ниже кода. Этот код хорошо работает для версии IE6 до IE11
<!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> <script> 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.); alert(rv); } } else { alert('otherbrowser'); } } else { //For < IE11 alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)))); } return false; }} </script> </body> </html>
Я знаю, что это может быть излишним, чтобы использовать lib для этого, но просто, чтобы обогатить теме, вы можете проверить есть.js способ сделать это:
is.firefox(); is.ie(6); is.not.safari();
в случае, если кто-то найдет это полезным, я сделал ответ Роба W в функцию, которая возвращает строку браузера, а не с несколькими переменными плавают. Поскольку браузер также не может измениться без загрузки снова и снова, я сделал его кэшировать результат, чтобы предотвратить его от необходимости работать в следующий раз, когда функция вызывается.
/** * 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());
вот скорректированная версия ответа Роба на 2016 год, включая Microsoft Edge и обнаружение Blink:
( edit: я обновил ответ Роба выше с этой информацией.)
// 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);красота этого подхода заключается в том, что он опирается на свойства движка браузера, поэтому он охватывает даже производные браузеры, такие как Яндекс или Вивальди, которые практически совместимы с основными браузерами, чьи движки они используют. Исключение составляет Opera, которая полагается на нюхание пользовательского агента, но сегодня (т. е. ver. 15 и выше) даже опера сама по себе только оболочка для моргания.
спасибо всем. Я протестировал фрагменты кода здесь на последних браузерах: Chrome 55, Firefox 50, IE 11 и Edge 38, и я придумал следующую комбинацию, которая работала для меня для всех из них. Я уверен, что это может быть улучшено, но это быстрое решение для тех, кто нуждается:
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);Он добавляет класс CSS в HTML, с именем браузера.
вот несколько известных библиотек, которые обрабатывают обнаружения браузера.
Баузер по lancedikson-2,713★s-последнее обновление 12 марта 2018 года-2,9 КБ
console.log(bowser); document.write("You are using " + bowser.name + " v" + bowser.version + " on " + bowser.osname);<script src="https://cdnjs.cloudflare.com/ajax/libs/bowser/1.9.3/bowser.min.js"></script>.js по bestiejs-1912★s-последнее обновление 23 января 2018 года-5,9 КБ
console.log(platform); document.write("You are using " + platform.name + " v" + platform.version + " on " + platform.os);<script src="https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.5/platform.min.js"></script>обнаружить.js by darcyclarke-501★s-последнее обновление 26 октября 2015 г. - 2.9 КБ
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);<script src="https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.min.js"></script>jQuery Browser по gabceb-485★s-последнее обновление 23 ноября 2015 года-1.3 КБ
console.log($.browser) document.write("You are using " + $.browser.name + " v" + $.browser.versionNumber + " on " + $.browser.platform);<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>обнаружение браузера (архив) по QuirksMode-последнее обновление 14 ноября 2013 года-884B
console.log(BrowserDetect) document.write("You are using " + BrowserDetect.browser + " v" + BrowserDetect.version + " on " + BrowserDetect.OS);<script src="https://kylemit.github.io/libraries/libraries/BrowserDetect.js"></script>
Заметных Упоминаний:
- WhichBrowser - 1,230★s-последний обновлено 5 февраля 2018 года
- Modernizr - 22,320★s-последнее обновление 4 марта 2018 года-чтобы победить мертвую лошадь, обнаружение функций должно управлять любым canIuse вопросы стиля. Обнаружение браузера действительно только для тонкостей.
Более Дальнеишее Чтение
можно использовать
tryиcatchдля использования различных сообщений об ошибках браузера. IE и edge были перепутаны, но я использовал утку, набранную из Rob W (на основе этого проекта здесь:https://www.khanacademy.org/computer-programming/i-have-opera/2395080328).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; } } };
существует также менее "хаки" метод, который работает для всех популярных браузеров. Google включил браузер-проверьте их Библиотеки Закрытия. В частности, взгляните на
goog.userAgentиgoog.userAgent.product. Таким образом, вы также в курсе, если что-то меняется в том, как браузеры представляют себя (учитывая, что вы всегда использовать последнюю версию компилятора.)
короткий вариант
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());
Если вам нужно знать, что такое числовая версия какого-либо конкретного браузера, вы можете использовать следующий фрагмент кода. В настоящее время он расскажет вам версию Chrome/Chromium/Firefox:
var match = $window.navigator.userAgent.match(/(?:Chrom(?:e|ium)|Firefox)\/([0-9]+)\./); var ver = match ? parseInt(match[1], 10) : 0;
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"}, {string: navigator.userAgent, subString: "MSIE", identity: "Explorer"}, {string: navigator.userAgent, subString: "Trident", identity: "Explorer"}, {string: navigator.userAgent, subString: "Firefox", identity: "Firefox"}, {string: navigator.userAgent, subString: "Opera", identity: "Opera"}, {string: navigator.userAgent, subString: "OPR", identity: "Opera"}, {string: navigator.userAgent, subString: "Chrome", identity: "Chrome"}, {string: navigator.userAgent, subString: "Safari", identity: "Safari"} ] }; BrowserDetect.init(); var bv= BrowserDetect.browser; if( bv == "Chrome"){ $("body").addClass("chrome"); } else if(bv == "MS Edge"){ $("body").addClass("edge"); } else if(bv == "Explorer"){ $("body").addClass("ie"); } else if(bv == "Firefox"){ $("body").addClass("Firefox"); } $(".relative").click(function(){ $(".oc").toggle('slide', { direction: 'left', mode: 'show' }, 500); $(".oc1").css({ 'width' : '100%', 'margin-left' : '0px', }); });
этой сочетает в себе оригинальный ответ Роба и обновление плова на 2016 год
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:<hr>'; output += 'isFirefox: ' + isFirefox + '<br>'; output += 'isChrome: ' + isChrome + '<br>'; output += 'isSafari: ' + isSafari + '<br>'; output += 'isOpera: ' + isOpera + '<br>'; output += 'isIE: ' + isIE + '<br>'; output += 'isIE Edge: ' + isEdge + '<br>'; document.body.innerHTML = output;
здесь вы узнаете, какой браузер он работает.
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")} }
UAParser является одним из облегченной библиотеки JavaScript для идентификации браузера, движка, ОС, процессора и типа/модели устройства из строки userAgent.
есть CDN доступны. Здесь я включил пример кода для обнаружения браузера с помощью UAParser.
<!doctype html> <html> <head> <script src="https://cdn.jsdelivr.net/npm/ua-parser-js@0/dist/ua-parser.min.js"></script> <script type="text/javascript"> var parser = new UAParser(); var result = parser.getResult(); console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"} </script> </head> <body> </body> </html>теперь вы можете использовать значение
result.browserусловно запрограммировать вашу страницу.Источник Урока: как определить браузер, двигатель, ОС, процессор и устройство с помощью JavaScript?
простая, одна строка кода JavaScript даст вам имя браузера:
function GetBrowser() { return navigator ? navigator.userAgent.toLowerCase() : "other"; }
Comments