Как определить браузер Safari, Chrome, IE, Firefox и Opera?

У меня есть 5 дополнений / расширений для FF, Chrome, IE, Opera и Safari.

Как я могу распознать браузер пользователя и перенаправить (после нажатия кнопки установки), чтобы загрузить соответствующее дополнение?

 YakovL25 апр. 2018 г., 19:02
Detective.js больше не поддерживается (в соответствии сgithub.com/darcyclarke/Detect.js), они рекомендуютgithub.com/lancedikson/bowser
 dude09 мар. 2016 г., 11:54
попробуйте Detejs, он может быть использован для всех браузеров
 KyleMit14 февр. 2019 г., 15:05
 Luzan Baral23 мая 2018 г., 08:22
Я использовал UAParser Plugin, он написан на Vanilla JavaScript. Источник:Как определить браузер, движок, ОС, процессор и устройство с помощью JavaScript?
 Matthijs Wessels02 сент. 2016 г., 12:23

Ответы на вопрос(19)

function GetBrowser()
{
    return  navigator ? navigator.userAgent.toLowerCase() : "other";
}
 eremzeit12 сент. 2015 г., 00:39
Один пользовательский агент не говорит нам достаточно. Например, мой пользовательский агент - «Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 45.0.2454.85 Safari / 537.36», в котором упоминаются Mozilla, Chrome и Safari. Какой тип браузера я?
 Nirav Mehta12 сент. 2015 г., 06:56
Извините, но я не получил вас за "Какой тип браузера я?" что ты хочешь получить?
 Baldráni08 мар. 2016 г., 10:41
@NiravMehta Он имел в виду, чтоnavigator.userAgent сообщает вам о каждом браузере, который у вас есть. Так что это действительно ненадежно, единственный случай, когда он будет работать, - это если у пользователя только один браузер.
 Juvenik27 июн. 2017 г., 07:40
это не надежный способ обнаружения браузера. Некоторые пользовательские агенты включают в себя как Chrome, так и Safari, поэтому нет способа определить, какой из них следует рассмотреть и использовать, но, что немаловажно, пользовательский агент может быть изменен веб-страницей.

что может быть излишним использовать библиотеку для этого, но просто чтобы обогатить поток, вы можете проверитьis.js способ сделать это:

is.firefox();
is.ie(6);
is.not.safari();
 Riga29 июн. 2016 г., 11:08
jQuery имел обыкновение включать подобные свойства: $ .browser.msie ... были удалены из версии 1.9api.jquery.com/jquery.browser
 TygerKrash20 окт. 2015 г., 11:50
Стоит только отметить, что под капотом в первую очередь происходит обнаружение User-Agent. Дополнено определением продавцов / обнаружением некоторых мест.
 Rafael Eyng17 апр. 2016 г., 18:26
@ TygerKrash уверен, вы абсолютно правы. Вот что я на самом деле имел ввиду в своем ответе: откройте исходный кодis.js и проверь как они это делают.
 kashiraja17 февр. 2019 г., 08:23
Это, безусловно, самый надежный подход, если предположить, что строка UA не была изменена. Он также правильно определяет ОС (Android, Win, Mac, Linux); тип устройства (настольный, планшетный, мобильный). Он также может проверить версию браузера.
 HoldOffHunger26 окт. 2017 г., 22:30
@RafaelEyng: Я думаю, что проблема с определением User-Agent заключается в том, что этот метод ненадежен.

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)

 RezaRahmati13 мар. 2019 г., 20:06
это покажет «сафари» при просмотре с «хром» на IOS
 Alex Nikulin23 мар. 2018 г., 12:16
Если вы не любите меня, пожалуйста, объясните, почему.

какой браузер работает.

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")}


        }

Мы можем использовать ниже используемые методы

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);
    };
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',
   });
});

UAParser является одной из облегченных библиотек JavaScript, позволяющих идентифицировать браузер, механизм, ОС, ЦП и тип / модель устройства из строки userAgent.

Доступен CDN. Здесь я включил пример кода для обнаружения браузера с помощью UAParser.

<!doctype html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/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?

 deathangel90825 июн. 2018 г., 17:44
a тысяча строки кода вы называете легким?
Решение Вопроса

роверке строки агента пользователя. Этот методне надежный, потому что подделать это значение тривиально.
Я написал метод для обнаружения браузеров поутиная типизация.

Используйте метод обнаружения браузера только в том случае, если это действительно необходимо, например, для показа инструкций для конкретного браузера по установке расширения.По возможности используйте функцию обнаружения.

Демо-версия: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 = /*@[email protected]*/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;
Анализ надежности

предыдущий метод зависит от свойств движка рендеринга (-moz-box-sizing а также-webkit-transform) для обнаружения браузера. Эти префиксы будут в конечном итоге отброшены, поэтому, чтобы сделать обнаружение еще более надежным, я переключился на характеристики браузера:

Internet Explorer: JScriptУсловная компиляция (до IE9) иdocument.documentMode.Edge: в браузерах Trident и Edge реализация Microsoft раскрываетStyleMedia конструктор. Исключая Трайдент, оставляет нас с Эджем.Firefox: API Firefox для установки дополнений:InstallTriggerChrome: глобальныйchrome объект, содержащий несколько свойств, включая документированныйchrome.webstore объект.Обновление 3chrome.webstore устарела и не определена в последних версияхSafari: уникальный шаблон именования имен конструкторов. Это наименее надежный метод из всех перечисленных свойств, и угадайте, что? В Safari 9.1.3 это было исправлено. Итак, мы проверяем противSafariRemoteNotification, который был представлен после версии 7.1, чтобы охватить все Safaris от 3.0 и выше.Opera:window.opera существовал годами, нобудет сброшен когда Opera заменяет свой двигатель Blink + V8 (используется Chromium).Обновление 1:Опера 15 была выпущенаего строка UA выглядит как Chrome, но с добавлением «OPR». В этой версииchrome объект определен (ноchrome.webstore нет). Поскольку Opera изо всех сил пытается клонировать Chrome, для этой цели я использую сниффинг пользовательского агента.Обновление 2:!!window.opr && opr.addons может быть использован для обнаруженияОпера 20+ (Вечнозеленый).Blink:CSS.supports() был представлен в Blink однажды Google включил Chrome 28. Это, конечно, тот же Blink, что и в Opera.Успешно протестировано в:Firefox 0,8 - 61Chrome 1.0 - 71Опера 8,0 - 34Safari 3.0 - 10IE 6 - 11Край - 20-42

Обновлен в ноябре 2016 года и теперь включает обнаружение браузеров Safari от 9.1.3 и выше.

Обновлен в августе 2018 года для обновления последних успешных тестов Chrome, Firefox IE и Edge.

Обновлен в январе 2019 года, чтобы исправить обнаружение Chrome (из-за амортизации window.chrome.webstore) и включить последние успешные тесты Chrome.

 Badrush28 нояб. 2017 г., 06:54
Я получаю эту ошибку в сафари'safari' is not defined
 gman29 сент. 2016 г., 07:16
isSafari не работает с Safari 10. Я собираюсь доказать, что это плохое решение (не то, чтобы у меня было хорошее). Нет гарантии, что многие из проверок не будут удалены ИЛИ не будут добавлены другими браузерами. Каждый сайт, который использовал этот код для проверки Safari, просто ломался с обновлениями MacOS Sierra или Safari 10 :(
 st_bk29 окт. 2018 г., 07:48
window.chrome.webstore устарела, начиная с версии Chrome. 71:blog.chromium.org/2018/06/...
 nevf31 авг. 2016 г., 09:11
К вашему сведению Это не работает с расширениями Chrome, какwindow.chrome.webstore там не определено. Не проверял это с помощью расширений Firefox.is.js упомянутое в другом месте работает как в расширениях Chrome, так и в Firefox.
 DrZ21423 дек. 2016 г., 04:53
Но было ли это проверено намобильные версии из этих браузеров, а такженастольные версии слишком? И, честно говоря, существуют разные мобильные версии и разные версии для настольных компьютеров. Таким образом, Firefox имеет 3 двоичных файла для Windows, Linux, Mac OS и 2 двоичных файла для Android и iOS.

Edge, Opera, Chrome, Safari, Firefox, IE

Я сделал некоторые изменения в коде @nimesh, теперь он работает и для Edge, и проблема с Opera исправлена:

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

полезно ли это кому-то, но вот вариант, чтобы сделать TypeScript счастливым.

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 (/*@[email protected]*/false || !!document["documentMode"]) {
    return 'ie';
}

// Edge 20+
if (!(/*@[email protected]*/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';
}

}

Этот объединяет как оригинальный ответ Роба, так и обновление Пилау за 2016 год

     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 = /*@[email protected]*/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;
 HoldOffHunger26 окт. 2017 г., 21:56
Есть ли смысл сообщать пользователю, какой браузер он использует? Я предполагаю, что они уже знали бы это.
 Joe Borg02 нояб. 2017 г., 07:16
@HoldOffHunger его главная цель заключалась в том, чтобы адаптировать наиболее совместимый код к активному браузеру, а не информировать пользователя о том, какой браузер он использует. Если браузер, который они используют, не устарел и не был исключен из совместимости с backwars, в котором не мешало бы сообщить пользователю, что он может извлечь выгоду из лучшего опыта, если он переключится на что-то более современное

какая числовая версия какого-либо конкретного браузера, вы можете использовать следующий фрагмент. В настоящее время вам сообщат версию Chrome / Chromium / Firefox:

var match = $window.navigator.userAgent.match(/(?:Chrom(?:e|ium)|Firefox)\/([0-9]+)\./);
var ver = match ? parseInt(match[1], 10) : 0;

который работает для всех популярных браузеров. Google включил проверку браузера в ихЗакрытие библиотеки, В частности, посмотрите наgoog.userAgent а такжеgoog.userAgent.product, Таким образом, вы также будете в курсе, если что-то меняется в том, как себя представляют браузеры (учитывая, что вы всегда запускаете последнюю версию компилятора закрытия).

 HoldOffHunger26 окт. 2017 г., 21:43
Большинство ответов здесь не касаются того, чтобы быть «взломанным», если они являются единственным надежным методом. UserAgent, как отмечалось несколько раз, легко подделывается и, следовательно, ненадежен.

Вы можете попробовать следующий способ проверить версию браузера.

    <!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..indexOf("Opera") || navigator..indexOf('OPR')) != -1 ) 
    {
        alert('Opera');
    }
    else if(navigator..indexOf("Chrome") != -1 )
    {
        alert('Chrome');
    }
    else if(navigator..indexOf("Safari") != -1)
    {
        alert('Safari');
    }
    else if(navigator..indexOf("Firefox") != -1 ) 
    {
         alert('Firefox');
    }
    else if((navigator..indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10
    {
      alert('IE'); 
    }  
    else 
    {
       alert('unknown');
    }
    }
    </script>

    </body>
    </html>

И если вам нужно знать только версию IE Browser, вы можете следовать приведенному ниже коду. Этот код хорошо работает для версии 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.;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator..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.;
                    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;
        }}
</script>

</body>
</html>
 Golak Sarangi17 авг. 2016 г., 06:07
ответ выше проверяет хром перед проверкой на сафари. потому что сафари не будетchrome Ключевое слово в useragent. пример использования сафариmozilla/5.0 (macintosh; intel mac os x 10_11_5) applewebkit/601.6.17 (khtml, like gecko) version/9.1.1 safari/601.6.17
 zevee07 сент. 2016 г., 16:02
Stackoverflow использует этот метод
 user603175916 июн. 2016 г., 01:25
Как насчет Microsoft Edge?
 igaurav15 окт. 2015 г., 09:00
Зачем писать столько строк кода? userAgent неоднозначен.
 Kyle Vassella06 дек. 2017 г., 00:05
При тестировании этого в Opera (последняя версия) для меня возвращается «Chrome». Чтобы это исправить, я изменил оператор Opera if на:if(navigator.userAgent.indexOf("Opera") != -1 || navigator.userAgent.indexOf('OPR') != -1 )

ах: Chrome 55, Firefox 50, IE 11 и Edge 38, и я придумал следующую комбинацию, которая работала для меня для всех из них. Я уверен, что это можно улучшить, но это быстрое решение для тех, кто нуждается:

var browser_name = '';
isIE = /*@[email protected]*/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 с именем браузера.

Вы можете использовать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;
        }
    }
};
 Vadim13 дек. 2017 г., 17:07
Я предлагаю полностью избавиться от документа и окна. Смотрите IE chunk: return "firefox"; } else if (err.search ("[ошибка объекта]")! == -1 && e.message! = null && e.description! = null) {return "IE"; } else if (err.search ("невозможно преобразовать e в объект")! == -1) {return "opera";
 Vadim21 дек. 2017 г., 13:19
Просто выяснил причину. Похоже, что для работы с PAC-файлом Windows 7 не использует IE11, который установлен на моей машине, а скорее как IE7-подобный движок (вероятно, с хоста Windows). Таким образом, err.toString () выдает «[Ошибка объекта]», а внутри IE11 выдает строку «Невозможно получить свойство ...», как в вашем коде. Таким образом, приведенный выше код не должен работать с IE7.
 Vadim21 дек. 2017 г., 13:05
Странно, я больше не могу воспроизвести err.search ("[Ошибка объекта]"). Во всяком случае, для меня Firefox против Chrome против чего-то еще достаточно. Я использую его в файле PAC, где объекты окна и документа недоступны.
 Vadim13 дек. 2017 г., 16:42
Это отличная идея: вам не нужны ни «оконные», ни «навигаторные» объекты!
 Mason Jones18 дек. 2017 г., 19:40
Как это различает IE и край?

которые обрабатывают обнаружение браузера по состоянию на февраль 2019 года.

топливозаправщик от lancedikson - 3216 ★ s - последнее обновление 9 февраля 2019 г. - 2.9KB

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>

Platform.js by bestiejs - 2250 ★ s - Последнее обновление 30 октября 2018 г. - 5.9KB

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>

Браузер jQuery от gabceb - 504 ★ s - Последнее обновление 23 ноября 2015 г. - 1.3KB

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>

Detect.js (в архиве) от darcyclarke - 522 ★ s - последнее обновление 26 октября 2015 г. - 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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.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 355 ★ s - Последнее обновление 2 октября 2018 г.Modernizr - 23 397 ★ s - Последнее обновление: 12 января 2019 г. - Чтобы прокормить поданную лошадь, функция обнаружения должна управлять любыммогу ли я использовать вопросы стиля. Обнаружение браузера действительно предназначено только для предоставления настроенных изображений, загрузки файлов или инструкций для отдельных браузеров.Дальнейшее чтениеПереполнение стека - Обнаружение браузера в JavaScript?Переполнение стека - Как вы можете определить версию браузера?

включая Microsoft Edge и обнаружение Blink:

(редактировать: Я обновил ответ Роба выше этой информацией.)

// 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 = /*@[email protected]*/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, которая полагается на прослушивание пользовательского агента, но сегодня (т.е. версия 15 и выше) даже Opera сама по себе является лишь оболочкой для Blink.

 Issac Gable14 авг. 2017 г., 18:08
Я также нашелUAParser плагин js, который все еще поддерживается и имеет высокую точность и прост в использовании.
 pilau20 янв. 2016 г., 17:59
@NoR Какую версию Edge вы используете? Это имеет значение
 NoR20 янв. 2016 г., 17:45
!!window.MSAssertion; Тест не работает для меня в бета-версии Edge через удаленный рабочий стол. Возвращает ложь.
 pilau20 янв. 2016 г., 18:42
@NoR О, вы используете виртуальную машину ...MSAssertion Трюк настроен на версию 25. Но так как многие разработчики полагаются на виртуальные машины, я постараюсь настроить это в более старой версии. Хороший звонок. Благодарю.
 pilau20 янв. 2016 г., 21:07
@NoR Обновлено - должно быть будущее.StyleMedia (с большой буквы) объект специфичен для IE и Edge и, похоже, никуда не денется.

Ответ Роба В. в функцию, которая возвращает строку браузера, вместо того, чтобы плавать вокруг нескольких переменных. Поскольку браузер также не может измениться без повторной загрузки, я сделал его кеширующим, чтобы предотвратить необходимость его обработки при следующем вызове функции.

/**
 * 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 = /*@[email protected]*/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());

 pilau08 февр. 2017 г., 11:11
@eFriend Я обновил ответ на последние тесты браузера.
 Riz29 дек. 2016 г., 12:25
в браузере Edge возвращаетсяХром
 HoldOffHunger26 окт. 2017 г., 21:39
Мне это нравится, но я бы предпочел откат для userAgent (), а не «Не знаю».
 Bedla19 дек. 2018 г., 11:34
Свойствоwindow.chrome.webstore был удален в Chrome 71, поэтому этот подход больше не работает.

Ваш ответ на вопрос