Wie erkenne ich einen Browser für Safari, Chrome, IE, Firefox und Opera?

822

Ich habe 5 Addons / Erweiterungen für FF, Chrome, IE, Opera und Safari.

Wie kann ich den Benutzerbrowser erkennen und umleiten (sobald auf eine Installationsschaltfläche geklickt wurde), um das entsprechende Addon herunterzuladen?

FrankC
quelle
2
Versuchen Sie, detectjs, es kann für alle Browser verwendet werden
Alter
1
Mögliches Duplikat der Browsererkennung in JavaScript?
Matthijs Wessels
2
detect.js wird nicht mehr gepflegt (laut github.com/darcyclarke/Detect.js ), sie empfehlen github.com/lancedikson/bowser
YakovL
Ich habe das UAParser Plugin verwendet, es ist in Vanilla JavaScript geschrieben. Quelle: Wie erkennt man Browser, Engine, Betriebssystem, CPU und Gerät mithilfe von JavaScript?
Luzan Baral

Antworten:

1688

Wenn Sie nach einer zuverlässigen Browsererkennung suchen, wird häufig die Zeichenfolge des Benutzeragenten überprüft. Diese Methode ist nicht zuverlässig, da es trivial ist, diesen Wert zu fälschen.
Ich habe eine Methode geschrieben, um Browser durch Eingabe von Enten zu erkennen .

Verwenden Sie die Browsererkennungsmethode nur, wenn dies wirklich erforderlich ist, z. B. das Anzeigen von browserspezifischen Anweisungen zum Installieren einer Erweiterung. Verwenden Sie nach Möglichkeit die Funktionserkennung.

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;

Analyse der Zuverlässigkeit

Die vorherige Methode hing von den Eigenschaften der Rendering-Engine ( -moz-box-sizingund -webkit-transform) ab, um den Browser zu erkennen. Diese Präfixe werden irgendwann gelöscht. Um die Erkennung noch robuster zu gestalten, habe ich auf browserspezifische Merkmale umgestellt:

  • Internet Explorer: JScript's Conditional Compilation (bis IE9) und document.documentMode.
  • Edge: In Trident- und Edge-Browsern macht die Implementierung von Microsoft den StyleMediaKonstruktor verfügbar . Ohne Trident bleiben wir bei Edge.
  • Edge (basierend auf Chrom): Der Benutzeragent enthält am Ende den Wert "Edg / [version]" (Beispiel: "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, wie Gecko) Chrome / 80.0.3987.16 Safari / 537.36 Edg / 80.0.361.9 ").
  • Firefox: Firefox-API zum Installieren von Add-Ons: InstallTrigger
  • Chrome: Das globale chromeObjekt, das mehrere Eigenschaften enthält, einschließlich eines dokumentierten chrome.webstoreObjekts.
  • Update 3 chrome.webstoreist veraltet und in neueren Versionen nicht definiert
  • Safari: Ein eindeutiges Namensmuster bei der Benennung von Konstruktoren. Dies ist die am wenigsten haltbare Methode aller aufgelisteten Eigenschaften und wissen Sie was? In Safari 9.1.3 wurde dies behoben. Wir prüfen also SafariRemoteNotification, was nach Version 7.1 eingeführt wurde, um alle Safaris ab 3.0 abzudecken.
  • Opera: window.operaexistiert seit Jahren, wird jedoch gelöscht, wenn Opera seine Engine durch Blink + V8 (von Chromium verwendet) ersetzt.
  • Update 1: Opera 15 wurde veröffentlicht . Die UA-Zeichenfolge sieht aus wie Chrome, jedoch mit dem Zusatz "OPR". In dieser Version ist das chromeObjekt definiert (aber chrome.webstorenicht). Da Opera sich bemüht, Chrome zu klonen, verwende ich zu diesem Zweck das Sniffing von Benutzeragenten.
  • Update 2: !!window.opr && opr.addonsKann verwendet werden, um Opera 20+ (immergrün) zu erkennen .
  • Blink: CSS.supports() wurde in Blink eingeführt, als Google Chrome 28 einschaltete. Es ist natürlich das gleiche Blink, das in Opera verwendet wurde.

Erfolgreich getestet in:

  • Firefox 0.8 - 61
  • Chrome 1.0 - 71
  • Opera 8.0 - 34
  • Safari 3.0 - 10
  • IE 6 - 11
  • Kante - 20-42
  • Edge Dev - 80.0.361.9

Im November 2016 aktualisiert, um die Erkennung von Safari-Browsern ab 9.1.3 zu ermöglichen

Aktualisiert im August 2018, um die neuesten erfolgreichen Tests für Chrome, Firefox IE und Edge zu aktualisieren.

Aktualisiert im Januar 2019, um die Chrome-Erkennung (aufgrund der Abwertung von window.chrome.webstore) zu korrigieren und die neuesten erfolgreichen Tests für Chrome einzuschließen.

Im Dezember 2019 aktualisiert, um Edge basierend auf der Chrom-Erkennung hinzuzufügen (basierend auf dem @ Nimesh-Kommentar).

Rob W.
quelle
5
Zu Ihrer Information Dies funktioniert nicht mit Chrome-Erweiterungen, da dies dort nicht window.chrome.webstoredefiniert ist. Ich habe es nicht mit Firefox-Erweiterungen überprüft. is.jsAn anderer Stelle erwähnt funktioniert dies sowohl in Chrome- als auch in Firefox-Erweiterungen.
Nevf
60
isSafarifunktioniert nicht mit Safari 10. Ich werde argumentieren, dass dies eine schlechte Lösung ist (nicht, dass ich eine gute habe). Es gibt keine Garantie dafür, dass viele der Dinge, nach denen Sie suchen, nicht entfernt oder von anderen Browsern nicht hinzugefügt werden. Jede Site, die diesen Code zur Überprüfung auf Safari verwendete, brach gerade mit den Upgrades von macOS Sierra oder Safari 10 :(
gman
10
Aber wurde dies sowohl auf den mobilen Versionen dieser Browser als auch auf den Desktop-Versionen getestet ? Und ehrlich gesagt gibt es pro Plattform unterschiedliche mobile Versionen und unterschiedliche Desktop-Versionen. Firefox hat also 3 Binärdateien für Windows, Linux, Mac OS und 2 Binärdateien für Android und iOS.
DrZ214
3
Der Strom isSafarifunktioniert nicht <iframe>unter Safari 10.1.2
Mikko Ohtamaa
23
window.chrome.webstore ist ab Chrome ver veraltet. 71: blog.chromium.org/2018/06/…
st_bk
133

Sie können versuchen, die Browserversion auf folgende Weise zu überprüfen.

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

Und wenn Sie nur die IE-Browser-Version kennen müssen, können Sie dem folgenden Code folgen. Dieser Code funktioniert gut für die Versionen IE6 bis 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
quelle
3
Warum sollte man so viele Codezeilen schreiben? userAgent ist nicht eindeutig.
Igaurav
5
Was ist mit Microsoft Edge?
user6031759
3
In der obigen Antwort wird nach Chrom gesucht, bevor nach Safari gesucht wird. weil Safari kein chromeSchlüsselwort im Useragent hat. Beispiel für Safari 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
Golak Sarangi
11
Stackoverflow verwendet diese Methode
vityavv
3
Wenn ich dies in Opera (neueste Version) teste, wird für mich "Chrome" zurückgegeben. Um dies zu beheben, habe ich die Opera if-Anweisung geändert in:if(navigator.userAgent.indexOf("Opera") != -1 || navigator.userAgent.indexOf('OPR') != -1 )
Kyle Vassella
60

Ich weiß, dass es vielleicht übertrieben ist, eine Bibliothek dafür zu verwenden, aber nur um den Thread anzureichern, können Sie die Vorgehensweise von is.j überprüfen :

is.firefox();
is.ie(6);
is.not.safari();
Rafael Eyng
quelle
9
Es ist nur erwähnenswert, dass unter der Haube in erster Linie die User-Agent-Erkennung erfolgt. Ergänzt durch Herstellererkennung / einige Funktionserkennung an bestimmten Stellen.
TygerKrash
1
@ TylerKrash sicher, du hast absolut recht. Genau das habe ich mit meiner Antwort gemeint: Öffnen Sie den Quellcode von is.jsund überprüfen Sie, wie sie es tun.
Rafael Eyng
4
jQuery enthielt ähnliche Eigenschaften: $ .browser.msie ... Wurde aus Version 1.9 entfernt. api.jquery.com/jquery.browser
Riga
@ RafaelEyng: Ich denke, das Problem bei der User-Agent-Erkennung ist, dass diese Methode unzuverlässig ist.
HoldOffHunger
Dies ist definitiv der robusteste Ansatz, wenn Sie davon ausgehen, dass die UA-Zeichenfolge nicht geändert wurde. Es erkennt auch das Betriebssystem (Android, Win, Mac, Linux); Gerätetyp (Desktop, Tablet, Handy). Es kann auch die Version des Browsers testen.
Kashiraja
51

Hier sind einige prominente Bibliotheken, die sich ab Dezember 2019 mit der Browsererkennung befassen.

Bowser von lancedikson - 4.065 ★ s - Letzte Aktualisierung 2. Oktober 2019 - 4.8KB

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>

* unterstützt Edge basierend auf Chromium


Platform.js von bestiejs - 2.550 ★ s - Letzte Aktualisierung 14. April 2019 - 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 Browser von gabceb - 504 ★ s - Letzte Aktualisierung 23. November 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 (Archiviert) von darcyclarke - 522 ★ s - Letzte Aktualisierung 26. Oktober 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>

Browsererkennung (archiviert) von QuirksMode - Letzte Aktualisierung 14. November 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>


Bemerkenswerte Erwähnungen:

  • WhichBrowser - 1.355 ★ s - Zuletzt aktualisiert am 2. Oktober 2018
  • Modernizr - 23.397 ★ s - Letzte Aktualisierung 12. Januar 2019 - Um ein gefüttertes Pferd zu füttern, sollte die Funktionserkennung alle Fragen im CanIuse- Stil beantworten. Die Browsererkennung dient eigentlich nur dazu, benutzerdefinierte Bilder, Download-Dateien oder Anweisungen für einzelne Browser bereitzustellen.

Weiterführende Literatur

KyleMit
quelle
1
Lohnt sich ein paar Kb Overhead, um das Rad nicht neu zu erfinden.
Glyphe
46

Für den Fall, dass jemand dies nützlich findet, habe ich die Antwort von Rob W in eine Funktion umgewandelt, die die Browserzeichenfolge zurückgibt, anstatt mehrere Variablen im Umlauf zu haben. Da sich der Browser auch nicht wirklich ändern kann, ohne ihn erneut zu laden, habe ich das Ergebnis zwischengespeichert, um zu verhindern, dass es beim nächsten Aufruf der Funktion bearbeitet werden muss.

/**
 * 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
quelle
2
im Edge-Browser wird Chrome
Riz
2
@eFriend Ich habe die Antwort auf die neuesten Browsertests aktualisiert.
Pilau
4
Ich mag das, aber ich hätte einen Fallback gegenüber userAgent () anstelle von "Weiß nicht" vorgezogen.
HoldOffHunger
2
Die Eigenschaft window.chrome.webstorewurde in Chrome 71 entfernt, sodass dieser Ansatz nicht mehr funktioniert.
Bedla
Sie können die Funktion mit einer Funktion überschreiben, die einfach das cachedResult zurückgibt und die if-Anweisung weglässt. Beim ersten Mal müssen Sie das Ergebnis trotzdem zurückgeben. browser = function () {return cachedResult}; return cachedResult;
Timar Ivo Batis
22

Kurze Variante

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
quelle
Wenn Sie mich nicht mögen, erklären Sie bitte warum.
Alex Nikulin
2
Dies zeigt "Safari" beim Surfen mit "Chrome" auf iOS
Reza
11

Hier ist eine 2016 angepasste Version von Robs Antwort, einschließlich Microsoft Edge und Erkennung von Blink:

( Bearbeiten : Ich habe Robs Antwort oben mit diesen Informationen aktualisiert.)

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

Das Schöne an diesem Ansatz ist, dass er sich auf die Eigenschaften der Browser-Engine stützt und daher auch abgeleitete Browser wie Yandex oder Vivaldi abdeckt, die praktisch mit den wichtigsten Browsern kompatibel sind, deren Engines sie verwenden. Die Ausnahme ist Opera, das sich auf das Schnüffeln von Benutzeragenten stützt, aber heute (dh ab Version 15) ist sogar Opera selbst nur eine Shell für Blink.

Pilau
quelle
Der !!window.MSAssertion;Test funktioniert bei mir in der Edge-Beta über Remotedesktop nicht. Es wird false zurückgegeben.
NoR
@NoR Welche Version von Edge verwenden Sie? Es ist wichtig
Pilau
1
@NoR Oh, Sie verwenden die VM ... Der MSAssertionTrick ist auf Version 25 angepasst. Da sich jedoch viele Entwickler auf die VMs verlassen, werde ich versuchen, diese ältere Version anzupassen. Guter Anruf. Vielen Dank.
Pilau
1
@NoR Aktualisiert - sollte zukunftssicher sein. Das StyleMedia(großgeschriebene) Objekt ist spezifisch für IE und Edge und scheint nirgendwo hin zu gehen.
Pilau
1
Ich habe auch festgestellt, dass UAParser ein js-Plugin ist, das immer noch gewartet wird und sehr genau und einfach zu bedienen ist.
Issac Gable
9

Sie können die verschiedenen Browser-Fehlermeldungen verwenden tryund catchverwenden. IE und Edge waren verwechselt, aber ich habe die Ententypisierung von Rob W verwendet (basierend auf diesem Projekt hier: 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
quelle
Das ist eine großartige Idee: Sie brauchen weder "Fenster" - noch "Navigator" -Objekte!
Vadim
Mein Vorschlag ist, Dokument und Fenster vollständig zu entfernen. Siehe IE-Block: return "Firefox"; } else if (err.search ("[Objektfehler]")! == -1 && e.message! = null && e.description! = null) {return "IE"; } else if (err.search ("kann e nicht in Objekt konvertieren")! == -1) {return "opera";
Vadim

Wie unterscheidet das zwischen IE und Edge?
Mason Jones

Seltsamerweise kann ich err.search ("[Objektfehler]") nicht mehr reproduzieren. Wie auch immer, für mich ist Firefox gegen Chrom gegen etwas anderes genug. Ich verwende es in einer PAC-Datei, in der Fenster- und Dokumentobjekte nicht verfügbar sind.
Vadim

Ich habe gerade die Ursache herausgefunden. Es sieht so aus, als würde Windows 7 zum Ausführen einer PAC-Datei nicht IE11 verwenden, das auf meinem Computer installiert ist, sondern eine IE7-ähnliche Engine (wahrscheinlich vom Windows-Host). Err.toString () gibt also "[object Error]" aus, während im IE11 die Zeichenfolge "Unable to get property ..." wie in Ihrem Code angegeben wird. Der obige Code sollte also mit dem IE7 fehlschlagen.
Vadim

8

Dank euch allen. Ich habe die Codefragmente hier in den letzten Browsern getestet: Chrome 55, Firefox 50, IE 11 und Edge 38, und ich habe die folgende Kombination gefunden, die für alle von ihnen funktioniert hat. Ich bin sicher, dass es verbessert werden kann, aber es ist eine schnelle Lösung für alle, die es brauchen:

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

Es fügt dem HTML-Code eine CSS-Klasse mit dem Namen des Browsers hinzu.


hast du chrom auf ios getestet?
Vic

8

Keine Ahnung, ob es für jemanden nützlich ist, aber hier ist eine Variante, um TypeScript glücklich zu machen.

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
Warum haben Sie ein Wenn mit "falsch" als Bedingung?
Yonatan Nir
@YonatanNir Ich denke, es soll die bedingte Kompilierung erkennen: developer.mozilla.org/en-US/docs/Web/JavaScript/…
Lucas Azevedo
Die meisten Antworten hier beziehen sich nicht darauf, "hacky" zu sein, wenn sie die einzige zuverlässige Methode sind. userAgent wird, wie mehrfach erwähnt, leicht gefälscht und ist daher unzuverlässig.
HoldOffHunger
3
ein tausend Zeilen Code rufen Sie leichte?
Deathangel908
Gibt es einen Grund, dem Benutzer mitzuteilen, welchen Browser er verwendet? Ich kann mir vorstellen, dass sie das schon wissen würden.
HoldOffHunger
1
@HoldOffHunger Die Hauptabsicht bestand eher darin, den am besten kompatiblen Code an den aktiven Browser anzupassen, als den Benutzer darüber zu informieren, welchen Browser er verwendet. Es sei denn, der von ihnen verwendete Browser ist veraltet und von der Backwars-Kompatibilität ausgeschlossen. Es würde nicht schaden, den Benutzer wissen zu lassen, dass er von einer besseren Erfahrung profitieren kann, wenn er auf etwas aktuelleres umstellt
Joe Borg
Leider ist es keine gute Antwort. Edge hat Chrome in seiner userAgent-Nachricht. Es ist besser, !! window.chrome && (!! window.chrome.webstore || !! window.chrome.runtime) zu verwenden;
Przemo
16
Der userAgent allein sagt uns nicht genug. Mein Benutzeragent ist beispielsweise "Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit / 537.36 (KHTML, wie Gecko) Chrome / 45.0.2454.85 Safari / 537.36", in dem Mozilla, Chrome und Safari erwähnt werden. Welcher Browsertyp bin ich?
Eremzeit
Entschuldigung, aber ich habe Sie nicht für "Welcher Browsertyp bin ich?" was willst du bekommen
Nirav Mehta
1
@NiravMehta Was er damit gemeint hat, ist, navigator.userAgentdass er Ihnen sagt, dass jeder Browser möglich ist. Dies ist also wirklich nicht zuverlässig. Der einzige Fall, in dem es funktionieren würde, ist, wenn der Benutzer nur einen Browser hat.
Baldráni
1
Dies ist kein zuverlässiger Weg, um einen Browser zu erkennen. Einige Useragents enthalten sowohl Chrome als auch Safari. Es gibt also keine Möglichkeit zu erkennen, welche wir berücksichtigen sollten, und nicht zuletzt kann Useragent von der Webseite geändert werden.
Juvenik
5

Erkennen von Browsern auf Desktop und Mobile: Edge, Opera, Chrome, Safari, Firefox, IE

Ich habe einige Änderungen am @ nimesh-Code vorgenommen, jetzt funktioniert er auch für Edge, und das Opera-Problem wurde behoben:

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

Danke @nimesh Benutzer: 2063564

Irshad Khan
quelle
4

Es gibt auch eine weniger "hackige" Methode, die für alle gängigen Browser funktioniert. Google hat einen Browser-Check in seine Closure Library aufgenommen . Schauen Sie sich insbesondere goog.userAgentund an goog.userAgent.product. Auf diese Weise sind Sie auch auf dem neuesten Stand, wenn sich etwas an der Darstellung der Browser ändert (vorausgesetzt, Sie führen immer die neueste Version des Closure-Compilers aus.)

Albert
quelle
Die meisten Antworten hier beziehen sich nicht darauf, "hacky" zu sein, wenn sie die einzige zuverlässige Methode sind. userAgent wird, wie mehrfach erwähnt, leicht gefälscht und ist daher unzuverlässig.
HoldOffHunger
4

Wenn Sie wissen müssen, wie die numerische Version eines bestimmten Browsers lautet, können Sie das folgende Snippet verwenden. Derzeit wird Ihnen die Version von Chrome / Chromium / Firefox angezeigt:

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

UAParser ist eine der leichtgewichtigen JavaScript-Bibliotheken zum Identifizieren von Browser, Engine, Betriebssystem, CPU und Gerätetyp / -modell anhand der userAgent-Zeichenfolge.

Es ist ein CDN verfügbar. Hier habe ich einen Beispielcode zum Erkennen des Browsers mit UAParser eingefügt.

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

Jetzt können Sie den Wert von verwenden result.browser, um Ihre Seite bedingt zu programmieren.

Quell-Tutorial: Wie erkenne ich Browser, Engine, Betriebssystem, CPU und Gerät mithilfe von JavaScript?

Luzan Baral
quelle
3
ein tausend Zeilen Code rufen Sie leichte?
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
quelle
0

Dies kombiniert sowohl Robs ursprüngliche Antwort als auch Pilaus Update für 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
quelle
Gibt es einen Grund, dem Benutzer mitzuteilen, welchen Browser er verwendet? Ich kann mir vorstellen, dass sie das schon wissen würden.
HoldOffHunger
1
@HoldOffHunger Die Hauptabsicht bestand eher darin, den am besten kompatiblen Code an den aktiven Browser anzupassen, als den Benutzer darüber zu informieren, welchen Browser er verwendet. Es sei denn, der von ihnen verwendete Browser ist veraltet und von der Backwars-Kompatibilität ausgeschlossen. Es würde nicht schaden, den Benutzer wissen zu lassen, dass er von einer besseren Erfahrung profitieren kann, wenn er auf etwas aktuelleres umstellt
Joe Borg
0

Hier erfahren Sie, welcher Browser ausgeführt wird.

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
quelle
0

Wir können unten util Methoden verwenden

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
quelle
0
const isChrome = /Chrome/.test(navigator.userAgent)
const isFirefox = /Firefox/.test(navigator.userAgent)
Landaida
quelle
Leider ist es keine gute Antwort. Edge hat Chrome in seiner userAgent-Nachricht. Es ist besser, !! window.chrome && (!! window.chrome.webstore || !! window.chrome.runtime) zu verwenden;
Przemo
-3

Eine einfache, einzelne Zeile JavaScript-Code gibt Ihnen den Namen des Browsers:

function GetBrowser()
{
    return  navigator ? navigator.userAgent.toLowerCase() : "other";
}
Nirav Mehta
quelle
16
Der userAgent allein sagt uns nicht genug. Mein Benutzeragent ist beispielsweise "Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit / 537.36 (KHTML, wie Gecko) Chrome / 45.0.2454.85 Safari / 537.36", in dem Mozilla, Chrome und Safari erwähnt werden. Welcher Browsertyp bin ich?
Eremzeit
Entschuldigung, aber ich habe Sie nicht für "Welcher Browsertyp bin ich?" was willst du bekommen
Nirav Mehta
1
@NiravMehta Was er damit gemeint hat, ist, navigator.userAgentdass er Ihnen sagt, dass jeder Browser möglich ist. Dies ist also wirklich nicht zuverlässig. Der einzige Fall, in dem es funktionieren würde, ist, wenn der Benutzer nur einen Browser hat.
Baldráni
1
Dies ist kein zuverlässiger Weg, um einen Browser zu erkennen. Einige Useragents enthalten sowohl Chrome als auch Safari. Es gibt also keine Möglichkeit zu erkennen, welche wir berücksichtigen sollten, und nicht zuletzt kann Useragent von der Webseite geändert werden.
Juvenik