Jak wykryć przeglądarkę Safari, Chrome, IE, Firefox i Opera?


822

Mam 5 dodatków / rozszerzeń dla FF, Chrome, IE, Opera i Safari.

Jak rozpoznać przeglądarkę użytkownika i przekierować (po kliknięciu przycisku instalacji), aby pobrać odpowiedni dodatek?


2
wypróbuj Detectjs, można go używać we wszystkich przeglądarkach
koleś


2
Wykrywanie.js nie jest już utrzymywane (zgodnie z github.com/darcyclarke/Detect.js ), zalecają github.com/lancedikson/bowser
YakovL

Użyłem wtyczki UAParser, jest napisana w Vanilla JavaScript. Źródło: Jak wykryć przeglądarkę, silnik, system operacyjny, procesor i urządzenie za pomocą JavaScript?
Luzan Baral

Odpowiedzi:


1687

Googling w celu niezawodnego wykrywania przeglądarki często powoduje sprawdzenie ciągu agenta użytkownika. Ta metoda nie jest niezawodna, ponieważ fałszowanie tej wartości jest banalne.
Napisałem metodę wykrywania przeglądarek przez pisanie kaczek .

Używaj metody wykrywania przeglądarki tylko wtedy, gdy jest to naprawdę konieczne, na przykład wyświetlając instrukcje dotyczące przeglądarki dotyczące instalacji rozszerzenia. W miarę możliwości korzystaj z funkcji wykrywania.

Demo: https://jsfiddle.net/6spj1059/

// 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 - 79
var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);

// Edge (based on chromium) detection
var isEdgeChromium = isChrome && (navigator.userAgent.indexOf("Edg") != -1);

// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;


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 += 'isEdge: ' + isEdge + '<br>';
output += 'isEdgeChromium: ' + isEdgeChromium + '<br>';
output += 'isBlink: ' + isBlink + '<br>';
document.body.innerHTML = output;

Analiza niezawodności

Poprzednia metoda zależy od właściwości silnika renderowania ( -moz-box-sizingi -webkit-transform) w celu wykrycia przeglądarki. Te prefiksy zostaną ostatecznie usunięte, więc aby uczynić wykrywanie jeszcze bardziej niezawodnym, przełączyłem się na cechy charakterystyczne dla przeglądarki:

  • Internet Explorer: Kompilacja warunkowa JScript (do IE9) i document.documentMode.
  • Edge: W przeglądarkach Trident i Edge implementacja Microsoftu ujawnia StyleMediakonstruktora. Wyłączenie Trident pozostawia nam Edge.
  • Edge (oparty na chromie): Agent użytkownika zawiera na końcu wartość „Edg / [wersja]” (np .: „Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, jak Gecko) Chrome / 80.0.3987.16 Safari / 537,36 Edg / 80.0.361.9 ").
  • Firefox: Firefox API do instalowania dodatków: InstallTrigger
  • Chrome: chromeobiekt globalny zawierający kilka właściwości, w tym chrome.webstoreobiekt udokumentowany .
  • Aktualizacja 3 chrome.webstorejest przestarzała i niezdefiniowana w najnowszych wersjach
  • Safari: Unikalny wzorzec nazewnictwa w nazwie konstruktorów. Jest to najmniej trwała metoda ze wszystkich wymienionych właściwości i zgadnij co? W Safari 9.1.3 zostało to naprawione. Sprawdzamy więc SafariRemoteNotification, co zostało wprowadzone po wersji 7.1, aby objąć wszystkie Safari od wersji 3.0 i wyższych.
  • Opera: window.operaistnieje od lat, ale zostanie porzucona, gdy Opera zastąpi swój silnik Blink + V8 (używany przez Chromium).
  • Aktualizacja 1: Opera 15 została wydana , jej ciąg UA wygląda jak Chrome, ale z dodatkiem „OPR”. W tej wersji chromeobiekt jest zdefiniowany (ale chrome.webstorenie jest). Ponieważ Opera próbuje sklonować Chrome, do tego celu używam wąchania agenta użytkownika.
  • Aktualizacja 2: !!window.opr && opr.addonsmoże być używana do wykrywania Opery 20+ (evergreen).
  • Blink: CSS.supports() został wprowadzony w Blink, gdy Google włączył Chrome 28. Jest to oczywiście ten sam Blink, który był używany w Operze.

Z powodzeniem przetestowany w:

  • Firefox 0,8 - 61
  • Chrome 1.0 - 71
  • Opera 8.0 - 34
  • Safari 3.0 - 10
  • IE 6–11
  • Edge - 20-42
  • Edge Dev - 80.0.361.9

Zaktualizowano w listopadzie 2016 r., Aby obejmował wykrywanie przeglądarek Safari od wersji 9.1.3

Zaktualizowano w sierpniu 2018 r., Aby zaktualizować najnowsze udane testy Chrome, Firefox IE i Edge.

Zaktualizowano w styczniu 2019 r., Aby naprawić wykrywanie chrome (z powodu przestarzałości pliku window.chrome.webstore) i uwzględnić najnowsze udane testy na chrome.

Zaktualizowano w grudniu 2019 roku, aby dodać Edge na podstawie wykrywania Chromium (na podstawie komentarza @Nimesh).


5
FYI To nie działa z rozszerzeniami Chrome, ponieważ nie window.chrome.webstorejest tam zdefiniowane. Nie sprawdziłem tego z rozszerzeniami Firefox. is.jswspomniany gdzie indziej działa zarówno w rozszerzeniach Chrome, jak i Firefox.
nevf

60
isSafarinie działa z Safari 10. Będę argumentować, że to złe rozwiązanie (nie że mam dobre). Nie ma gwarancji, że wiele rzeczy, które sprawdzasz, nie zostanie usuniętych LUB nie zostaną dodane przez inne przeglądarki. Każda witryna, która używała tego kodu do sprawdzania Safari, po prostu zepsuła się z aktualizacjami macOS Sierra lub Safari 10 :(
gman

10
Ale czy zostało to przetestowane na mobilnych wersjach tych przeglądarek, a także na komputerach ? I prawdę mówiąc, istnieją różne wersje mobilne i różne wersje komputerowe na platformę. Tak naprawdę firefox ma 3 pliki binarne dla systemu Windows, Linux, Mac OS i 2 pliki binarne dla systemu Android i iOS.
DrZ214,

3
Prąd isSafarinie działa pod <iframe>Safari 10.1.2
Mikko Ohtamaa

23
window.chrome.webstore jest przestarzałe począwszy od wersji Chrome. 71: blog.chromium.org/2018/06/…
st_bk

133

Możesz wypróbować następujący sposób, aby sprawdzić wersję przeglądarki.

    <!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>

A jeśli potrzebujesz znać tylko wersję przeglądarki IE, możesz wykonać poniższy kod. Ten kod działa dobrze dla wersji IE6 do 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.$1);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>

3
Dlaczego napisać tak wiele wierszy kodu? userAgent jest niejednoznaczny.
igaurav

5
Co z Microsoft Edge?
user6031759,

3
powyższa odpowiedź sprawdza chrom przed sprawdzeniem safari. ponieważ safari nie będzie zawierało chromesłowa kluczowego w identyfikatorze użytkownika. przykład użytkownika safari -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
Golak Sarangi,


3
Podczas testowania tego w Operze (najnowsza wersja) zwraca mi to „Chrome”. Aby to naprawić, zmieniłem instrukcję Opera if na:if(navigator.userAgent.indexOf("Opera") != -1 || navigator.userAgent.indexOf('OPR') != -1 )
Kyle Vassella

60

Wiem, że użycie lib może być przesadne , ale aby wzbogacić wątek, możesz sprawdzić, jak to zrobić w is.js :

is.firefox();
is.ie(6);
is.not.safari();

9
Warto tylko zauważyć, że pod maską wykrywa przede wszystkim User-Agent. Uzupełniono wykrywaniem dostawcy / wykrywaniem niektórych funkcji w niektórych miejscach.
TygerKrash,

1
@TygerKrash na pewno masz całkowitą rację. Właśnie to miałem na myśli z moją odpowiedzią: otwórz kod źródłowy is.jsi sprawdź, jak to robią.
Rafael Eyng

4
jQuery zawierało podobne właściwości: $ .browser.msie ... Zostały usunięte z wersji 1.9 api.jquery.com/jquery.browser
Ryga

@RafaelEyng: Myślę, że problem z wykrywaniem User-Agent polega na tym, że ta metoda jest zawodna.
HoldOffHunger,

Jest to zdecydowanie najbardziej niezawodne podejście, jeśli założymy, że ciąg UA nie został zmodyfikowany. Prawidłowo wykrywa także system operacyjny (Android, Win, Mac, Linux); typ urządzenia (komputer stacjonarny, tablet, telefon komórkowy). Może również przetestować wersję przeglądarki.
kashiraja

51

Oto kilka wybitnych bibliotek, które obsługują wykrywanie przeglądarki od grudnia 2019 r.

Bowser autor: lancedikson - 4065 ★ s - Ostatnia aktualizacja 2 października 2019 r. - 4,8 KB

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);
<script src="https://unpkg.com/bowser@2.7.0/es5.js"></script>

* obsługuje Edge oparty na Chromium


Platform.js autor bestiejs - 2550 ★ s - Ostatnia aktualizacja 14 kwietnia 2019 - 5,9 KB

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 Browser autor: gabceb - 504 ★ s - Ostatnia aktualizacja 23 listopada 2015 - 1,3 KB

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 (zarchiwizowany) autor: darcyclarke - 522 ★ s - Ostatnia aktualizacja 26 października 2015 - 2,9 KB

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>

Wykrywanie przeglądarki (zarchiwizowane) przez QuirksMode - Ostatnia aktualizacja 14 listopada 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>


Ważne uwagi:

  • WhichBrowser - 1355 ★ s - Ostatnia aktualizacja 2 października 2018 r
  • Modernizr - 23 397 ★ s - Ostatnia aktualizacja 12 stycznia 2019 r. - Aby nakarmić karmionego konia, wykrywanie funkcji powinno kierować wszelkimi pytaniami w stylu CanIuse . Wykrywanie przeglądarki jest tak naprawdę tylko w celu dostarczania spersonalizowanych obrazów, pobierania plików lub instrukcji dla poszczególnych przeglądarek.

Dalsza lektura


1
Warto kilka kilogramów napowietrznych, aby nie wynaleźć koła.
glif

46

Na wypadek, gdyby ktokolwiek uznał to za przydatne, zmieniłem odpowiedź Roba W w funkcję, która zwraca ciąg przeglądarki, a nie wiele zmiennych. Ponieważ przeglądarka nie może się tak naprawdę zmienić bez ponownego ładowania, sprawiłem, że wyniki zostały zapisane w pamięci podręcznej, aby nie musiało to działać przy następnym wywołaniu funkcji.

/**
 * 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());


2
w przeglądarce Edge zwraca Chrome
Riz

2
@eFriend Zaktualizowałem odpowiedź do najnowszych testów przeglądarki.
pilau

4
Podoba mi się to, ale wolałbym awarię zamiast userAgent (), zamiast „Nie wiem”.
HoldOffHunger,

2
Właściwość window.chrome.webstorezostała usunięta w Chrome 71, więc to podejście nie działa.
Bedla,

możesz zastąpić funkcję funkcją, która po prostu zwraca cachedResult i pomija instrukcję if. Za pierwszym razem musisz jeszcze zwrócić wynik. browser = function () {return cachedResult}; return cachedResult;
Timar Ivo Batis

22

Krótki wariant

var browser = (function() {
    var test = function(regexp) {
        return regexp.test(window.navigator.userAgent);
    }
    switch (true) {
        case test(/edg/i): return "edge";
        case test(/opr/i) && (!!window.opr || !!window.opera): return "opera";
        case test(/chrome/i) && !!window.chrome: return "chrome";
        case test(/trident/i): return "ie";
        case test(/firefox/i): return "firefox";
        case test(/safari/i): return "safari";
        default: return "other";
    }
})();
console.log(browser)


Jeśli mnie nie lubisz, proszę wyjaśnij dlaczego.
Alex Nikulin

2
pokaże to „safari” podczas przeglądania z „chrome” na iOS
Reza

11

Oto wersja odpowiedzi Roba z 2016 roku, w tym Microsoft Edge i wykrywanie Mrugnięcia:

( edytuj : Zaktualizowałem odpowiedź Roba powyższymi informacjami).

// 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);

Piękno tego podejścia polega na tym, że opiera się on na właściwościach silnika przeglądarki, dlatego obejmuje nawet przeglądarki pochodne, takie jak Yandex lub Vivaldi, które są praktycznie kompatybilne z głównymi przeglądarkami, z których korzystają silniki. Wyjątkiem jest Opera, która opiera się na węszeniu agenta użytkownika, ale dziś (tj. Wer. 15 i więcej) nawet Opera sama jest jedynie powłoką dla Blink.


!!window.MSAssertion;Test nie działa na mnie w beta krawędzi poprzez Remote Desktop. Zwraca fałsz.
NoR

@NoR Z jakiej wersji Edge korzystasz? To ma znaczenie
pilau

1
@NoR Och, używasz maszyny wirtualnej ... MSAssertionSztuczka jest dostosowana do wersji 25. Ale ponieważ wielu programistów polega na maszynach wirtualnych, postaram się ją dostosować do tej starszej wersji. Dobra decyzja. Dzięki.
pilau

1
@NoR Zaktualizowano - powinien być przyszłościowy. Obiekt StyleMedia(pisany wielkimi literami) jest specyficzny dla IE i Edge i wydaje się, że nigdzie nie zmierza.
pilau

1
Znalazłem również UAParser wtyczkę js, która nadal jest utrzymywana i jest bardzo dokładna i łatwa w użyciu.
Issac Gable

9

Możesz używać tryi catchużywać różnych komunikatów o błędach przeglądarki. IE i Edge były pomieszane, ale użyłem pisania kaczki z Roba W (na podstawie tego projektu tutaj: 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;
        }
    }
};

To świetny pomysł: nie potrzebujesz ani obiektów „window”, ani „navigator”!
Vadim,

Moją propozycją jest całkowite usunięcie dokumentu i okna. Zobacz fragment IE: zwróć „firefox”; } else if (err.search ("[object error]")! == -1 && e.message! = null && e.description! = null) {return "IE"; } else if (err.search („nie można przekonwertować e na obiekt”)! == -1) {return „opera”;
Vadim,

Jak to rozróżnia IE i Edge?
Mason Jones,

Dziwne, nie mogę już odtworzyć err.search („[błąd obiektu]”). W każdym razie dla mnie firefox kontra chrome kontra coś innego wystarczy. Używam go w pliku PAC, w którym obiekty okien i dokumentów nie są dostępne.
Vadim,

Właśnie odkryłem przyczynę. Wygląda na to, że do funcjonowania pliku PAC Windows 7 nie używa IE11, który jest zainstalowany na moim komputerze, ale raczej silnik podobny do IE7 (prawdopodobnie z hosta Windows). Zatem err.toString () daje „[błąd obiektu]”, podczas gdy w IE11 daje ciąg „Nie można uzyskać właściwości ...” jak w kodzie. Tak więc powyższy kod powinien zawieść w IE7.
Vadim,

8

Dziękuję wszystkim. Testowałem fragmenty kodu tutaj w najnowszych przeglądarkach: Chrome 55, Firefox 50, IE 11 i Edge 38 i wymyśliłem następującą kombinację, która działała dla mnie dla wszystkich z nich. Jestem pewien, że można to poprawić, ale jest to szybkie rozwiązanie dla każdego, kto potrzebuje:

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);

Dodaje klasę CSS do kodu HTML o nazwie przeglądarki.


testowałeś Chrome na iOS?
Vic,

8

Nie mam pojęcia, czy jest to przydatne dla każdego, ale tutaj jest wariant, aby uszczęśliwić 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 (/*@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';
}

}


Dlaczego masz kilka ifs z „fałszywym” warunkiem?
Yonatan Nir

@YonatanNir Myślę, że ma to na celu wykrycie kompilacji warunkowej: developer.mozilla.org/en-US/docs/Web/JavaScript/…
Lucas Azevedo

5

Wykrywanie przeglądarek na komputerach i urządzeniach mobilnych: Edge, Opera, Chrome, Safari, Firefox, IE

Wprowadziłem kilka zmian w kodzie @nimesh, teraz działa on również dla Edge, a problem Opera został naprawiony:

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

Dzięki użytkownik @nimesh: 2063564


4

Istnieje również mniej „hacky” sposób, który działa we wszystkich popularnych przeglądarkach. Google umieściło kontrolę przeglądarki w swojej Bibliotece zamknięcia . W szczególności spójrz na goog.userAgenti goog.userAgent.product. W ten sposób jesteś również na bieżąco, jeśli coś zmieni się w sposobie prezentacji się przeglądarki (biorąc pod uwagę, że zawsze uruchamiasz najnowszą wersję kompilatora zamknięcia).


Większość odpowiedzi tutaj nie dotyczy „hackowania”, jeśli są one jedyną niezawodną metodą. userAgent, jak wielokrotnie wspomniano, łatwo jest sfałszować, a zatem jest zawodny.
HoldOffHunger,

4

Jeśli chcesz wiedzieć, jaka jest wersja numeryczna określonej przeglądarki, możesz użyć następującego fragmentu kodu. Obecnie poinformuje Cię o wersji Chrome / Chromium / Firefox:

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

2

UAParser jest jedną z lekkich bibliotek JavaScript do identyfikacji przeglądarki, silnika, systemu operacyjnego, procesora oraz typu / modelu urządzenia na podstawie ciągu userAgent.

Dostępna jest sieć CDN. Podałem tutaj przykładowy kod wykrywający przeglądarkę za pomocą 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>

Teraz możesz użyć wartości result.browserwarunkowo zaprogramować swoją stronę.

Samouczek źródłowy: Jak wykryć przeglądarkę, silnik, system operacyjny, procesor i urządzenie za pomocą JavaScript?


3
a tysiąc linii kodu wywołać lekkie?
deathangel908

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

0

To łączy oryginalną odpowiedź zarówno Roba i aktualizacji pilaw za 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;

Czy warto informować użytkownika, jakiej przeglądarki używa? Wyobrażam sobie, że już to wiedzą.
HoldOffHunger,

1
@HoldOffHunger jego głównym celem było raczej dostosowanie najbardziej kompatybilnego kodu do aktywnej przeglądarki, a nie poinformowanie użytkownika, której przeglądarki używa. O ile przeglądarka, której używają, nie jest przestarzała i nie została wyłączona z kompatybilności z backwars, w której nie zaszkodzi poinformować użytkownika, że ​​mogą skorzystać z lepszych wrażeń, jeśli przejdą na coś bardziej aktualnego
Joe Borg

0

Tutaj dowiesz się, która przeglądarka jest uruchomiona.

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


        }

0

Możemy użyć poniższych metod

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

0
const isChrome = /Chrome/.test(navigator.userAgent)
const isFirefox = /Firefox/.test(navigator.userAgent)

Niestety nie jest to dobra odpowiedź. Edge ma Chrome w swojej wiadomości UserAgent. Lepiej jest użyć !! window.chrome && (!! window.chrome.webstore || !! window.chrome.runtime);
Przemo

-3

Prosty, pojedynczy wiersz kodu JavaScript podaje nazwę przeglądarki:

function GetBrowser()
{
    return  navigator ? navigator.userAgent.toLowerCase() : "other";
}

16
Sam userAgent nie mówi nam wystarczająco dużo. Na przykład moim agentem użytkownika jest „Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit / 537.36 (KHTML, jak Gecko) Chrome / 45.0.2454.85 Safari / 537.36”, w którym wspomniano o Mozilli, Chrome i Safari. Jakim typem przeglądarki jestem?
eremzeit

Przykro mi, ale nie dostałem odpowiedzi na pytanie „Jakiego rodzaju przeglądarką jestem?” co chcesz dostać
Nirav Mehta,

1
@NiravMehta Miał na myśli to, że ma na myśli navigator.userAgentkażdą możliwą przeglądarkę, którą masz. Więc to naprawdę nie jest niezawodne, jedynym przypadkiem byłoby, gdyby użytkownik miał tylko jedną przeglądarkę.
Baldráni

1
nie jest to niezawodny sposób na wykrycie przeglądarki. Niektóre narzędzia użytkownika obejmują zarówno chrome, jak i safari, więc nie ma sposobu na wykrycie, który z nich należy wziąć pod uwagę i na koniec, ale nie mniej, użytkownik może zostać zmodyfikowany przez stronę internetową.
Juvenik
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.