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?

FrankC
źródło
2
wypróbuj Detectjs, można go używać we wszystkich przeglądarkach
koleś
1
Możliwy duplikat wykrywania przeglądarki w JavaScript?
Matthijs Wessels
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
Możliwy duplikat Jak wykryć wersję przeglądarki?
KyleMit

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

Rob W
źródło
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>
Nimesh
źródło
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,
11
Stackoverflow
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();
Rafael Eyng
źródło
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/[email protected]/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

KyleMit
źródło
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());

willsquire
źródło
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)

Alex Nikulin
źródło
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.

pilaw
źródło
!!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;
        }
    }
};
Mason Jones
źródło
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';
}

}

Tony Smith
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
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,
3
a tysiąc linii kodu wywołać lekkie?
deathangel908
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
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
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
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

Irshad Khan
źródło
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).

Albert
źródło
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;
Valera Tumash
źródło
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?

Luzan Baral
źródło
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',
   });
});
Neel upadhyay
źródło
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;
Joe Borg
źródło
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")}


        }
Ajay Kumar
źródło
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);
    };
NPE
źródło
0
const isChrome = /Chrome/.test(navigator.userAgent)
const isFirefox = /Firefox/.test(navigator.userAgent)
Landaida
źródło
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";
}
Nirav Mehta
źródło
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