JavaScript: Wie kann man herausfinden, ob der Benutzerbrowser Chrome ist?

220

Ich benötige eine Funktion, die einen booleschen Wert zurückgibt, um zu überprüfen, ob der Browser Chrome ist .

Wie erstelle ich solche Funktionen?

Rella
quelle
16
Sind Sie sicher, dass Sie stattdessen keine Feature-Erkennung durchführen möchten (anstatt zu fragen, ob dies Chrome ist? Fragen Sie, ob dies das ist, was ich brauche?)
bdukes
42
Wer weiß? Vielleicht möchte er, dass der Benutzer eine Chrome-Erweiterung herunterlädt
naveen
2
Diese Frage veranschaulicht das Problem der Benutzeragentenerkennung. Nur drei Jahre später wird der Fun 3D Box-Hintergrund mein Low-End-Mobiltelefon in Chrome laden (versuchen), aber nicht einmal Firefox auf meinem High-End-Desktop-Computer.
Álvaro González
5
Ich bin damit einverstanden, dass die Erkennung von Funktionen der richtige Weg ist. Es gibt jedoch legitime Bereiche, in denen Sie erkennen möchten. zB möchte ich xhr.sendAsBinary nur für Chrome patchen. Meine ursprüngliche Lösung hat überprüft, ob filereader.readasbinary implementiert ist. Ich habe jedoch Probleme, bei denen es auch für bestimmte mobile Browser gepatcht wird und der Upload daher fehlschlägt. Ich möchte dieses Update nur für Chrom.
frostymarvelous
4
Möchten Sie wissen, warum es möglicherweise relevant ist, zu wissen, ob ein Browser Chrome ist? Wie wäre es, wenn Chrome keine RSS-Feeds laden könnte? Anstatt eine Verknüpfung zu einem RSS-Feed herzustellen, der in Chrome nicht geladen werden kann, könnten Sie tatsächlich eine Warnung bereitstellen oder den Benutzer umleiten? Nein danke dir Google Chrome ...
Pic Mickael

Antworten:

205

Update: In Jonathans Antwort finden Sie eine aktualisierte Vorgehensweise. Die folgende Antwort funktioniert möglicherweise immer noch, kann jedoch in anderen Browsern zu Fehlalarmen führen.

var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

Wie bereits erwähnt, können User Agents gefälscht werden. Daher ist es immer am besten, bei der Behandlung dieser Probleme die Feature-Erkennung (z. B. Modernizer ) zu verwenden, wie in anderen Antworten erwähnt.

Rion Williams
quelle
Was ist der Grund für die Verwendung von .toLowerCase? Warum nicht einfach navigator.userAgent.indexOf ('Chrome')? Ich sehe, dass viele Leute es verwenden, aber ich bin mir nicht sicher, worum es geht.
Jon
7
@Serg, weil sie kein Chrome haben. Es ist nur ein Skin um iOS Safari.
Poetro
2
Vielen Dank, obwohl Ihr Variablenname camelCase sein sollte
Dimitri Kopriwa
5
Da viele Browser diesbezüglich true zurückgeben, habe ich hier den Code verwendet, der Edge, Maxthon, iOS-Safari usw. ausgeschlossen hat var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.
2
Opera (mindestens Version 42) kehrt Google Inczu zurück navigator.vendor, daher ist diese Methode nicht kugelsicher. Etwas wie /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)würde wahrscheinlich besser funktionieren
yorch
314

Versuchen Sie Folgendes , um zu überprüfen, ob der Browser Google Chrome ist:

// please note, 
// that IE11 now returns undefined again for window.chrome
// and new Opera 30 outputs true for window.chrome
// but needs to check if window.opr is not undefined
// and new IE Edge outputs to true now for window.chrome
// and if not iOS Chrome check
// so use the below updated condition
var isChromium = window.chrome;
var winNav = window.navigator;
var vendorName = winNav.vendor;
var isOpera = typeof window.opr !== "undefined";
var isIEedge = winNav.userAgent.indexOf("Edge") > -1;
var isIOSChrome = winNav.userAgent.match("CriOS");

if (isIOSChrome) {
   // is Google Chrome on IOS
} else if(
  isChromium !== null &&
  typeof isChromium !== "undefined" &&
  vendorName === "Google Inc." &&
  isOpera === false &&
  isIEedge === false
) {
   // is Google Chrome
} else { 
   // not Google Chrome 
}

Anwendungsbeispiel: http://codepen.io/jonathan/pen/WpQELR

Der Grund dafür ist, dass Sie den Google Chrome-Inspektor verwenden und zur Registerkarte "Konsole" wechseln. Geben Sie 'window' ein und drücken Sie die Eingabetaste. Anschließend können Sie die DOM-Eigenschaften für das 'Fensterobjekt' anzeigen. Wenn Sie das Objekt reduzieren, können Sie alle Eigenschaften anzeigen, einschließlich der Eigenschaft 'chrome'.

Sie können nicht mehr streng gleich true verwenden, um im IE nachzuschauen window.chrome. Früher kehrte der IE zurück undefined, jetzt kehrt er zurück true. Aber raten Sie mal, IE11 gibt jetzt wieder undefiniert zurück. IE11 gibt auch eine leere Zeichenfolge ""für zurück window.navigator.vendor.

Ich hoffe das hilft!

AKTUALISIEREN:

Vielen Dank an Halcyon991 für den Hinweis, dass die neue Opera 18+ auch für true ausgegeben wirdwindow.chrome . Es sieht so aus, als ob Opera 18 auf Chrom 31 basiert . Also habe ich einen Scheck hinzugefügt, um sicherzustellen, dass das window.navigator.vendorist: "Google Inc"und nicht ist "Opera Software ASA". Auch danke an Ring und Adrien Be für die Hinweise, dass Chrome 33 nicht mehr wahr ist ... window.chromeprüft jetzt, ob es nicht null ist. Aber achten Sie genau auf IE11. Ich habe die Überprüfung hinzugefügt, undefinedda IE11 jetzt ausgegeben wird undefined, wie bei der ersten Veröffentlichung. Nach einigen Update-Builds wird es ausgegeben true. Jetzt wird der letzte Update-Build undefinedwieder ausgegeben . Microsoft kann sich nicht entscheiden!

UPDATE 24.07.2015 - Ergänzung für Opera Check

Opera 30 wurde gerade veröffentlicht. Es wird nicht mehr ausgegeben window.opera. Und window.chromegibt in der neuen Opera 30 auch true aus. Sie müssen also überprüfen, ob OPR im userAgent enthalten ist . Ich habe meinen obigen Zustand aktualisiert, um dieser neuen Änderung in Opera 30 Rechnung zu tragen, da dieselbe Render-Engine wie Google Chrome verwendet wird.

UPDATE 13.10.2015 - Ergänzung zur IE-Prüfung

Überprüfung für IE Edge hinzugefügt, da es truefür window.chrome.. ausgibt , obwohl IE11 undefinedfür ausgibt window.chrome. Vielen Dank an artfulhacker, der uns darüber informiert hat!

UPDATE 05.02.2016 - Ergänzung für iOS Chrome Check

Prüfung für iOS Chrome-Prüfung hinzugefügt, CriOSda sie truefür Chrome unter iOS ausgegeben wird. Vielen Dank an xinthose, dass Sie uns darüber informiert haben!

UPDATE 18.04.2008 - Änderung für Opera-Check

Bearbeitet Check für Opera, Kontrolle window.oprist nicht undefinedda jetzt Chrome 66 hat OPRin window.navigator.vendor. Vielen Dank an Frosty Z und Daniel Wallman für die Meldung!

Jonathan Marzullo
quelle
Dies funktioniert nicht für IE10. typeof window.chrome in IE10 gibt {object} zurück
magritte
2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Ring
1
Danke @xinthose .. Ich habe gerade einen Scheck für IOS Chrome hinzugefügt .. sehr geschätzt! :)
Jonathan Marzullo
2
Vielleicht das gleiche Problem wie Daniel Wallman hier: Mein Android Chrome-Benutzeragent enthält die Zeichenfolge "OPR"! Mozilla/5.0 (Linux; Android 8.0.0; ASUS_Z012D Build/OPR1.170623.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36Daher isChrome()kehrt falsch .
Frosty Z
2
Vielen Dank an @FrostyZ und @DanielWallman, dass Sie uns informiert haben. Ich reparierte es so Opera prüft , ob window.oprnicht undefined.
Jonathan Marzullo
21

noch kürzer: var is_chrome = /chrome/i.test( navigator.userAgent );

Der große Lebowski
quelle
27
Zurück truein Microsoft Edge.
Cobby
16

Eine viel einfachere Lösung ist nur zu verwenden:

var isChrome = !!window.chrome;

Das !!konvertiert das Objekt einfach in einen booleschen Wert. In Nicht-Chrome-Browsern ist diese Eigenschaft undefinednicht wahr.

Beachten Sie, dass dies auch für Versionen von Edge zurückgegeben wird, die auf Chrome basieren (danke @Carrm für den Hinweis).

Drew Noakes
quelle
5
Opera kehrt tatsächlich truezu window.chrome. Schauen Sie sich conditionizr.com an, das über eine kugelsichere Erkennung + Korrektur verfügt.
Halcyon991
7
Nun, Opera ist im Grunde genommen Chrome
Karel Bílek
Ich verstehe nur nicht warum zweimal !! , u können direkt verwenden, wenn (Chrom) {}
Vishal Sharma
3
@vishalsharma, !!konvertiert den Wert entweder trueoder false. typeof(window.chrome)gibt "object", während typeof(!!window.chrome)gibt "boolean". Ihr Codebeispiel funktioniert auch, da die ifAnweisung die Konvertierung durchführt.
Drew Noakes
1
Dies gibt auch truefür Edge zurück.
Carrm
14

console.log(JSON.stringify({
  isAndroid: /Android/.test(navigator.userAgent),
  isCordova: !!window.cordova,
  isEdge: /Edge/.test(navigator.userAgent),
  isFirefox: /Firefox/.test(navigator.userAgent),
  isChrome: /Google Inc/.test(navigator.vendor),
  isChromeIOS: /CriOS/.test(navigator.userAgent),
  isChromiumBased: !!window.chrome && !/Edge/.test(navigator.userAgent),
  isIE: /Trident/.test(navigator.userAgent),
  isIOS: /(iPhone|iPad|iPod)/.test(navigator.platform),
  isOpera: /OPR/.test(navigator.userAgent),
  isSafari: /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent),
  isTouchScreen: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
  isWebComponentsSupported: 'registerElement' in document && 'import' in document.createElement('link') && 'content' in document.createElement('template')
}, null, '  '));

Josef Ježek
quelle
Leider navigator.vendor === "Google Inc." Unter Opera (mindestens Version 49) wird die Verwendung Ihres Codes Opera als Chrome angezeigt.
Wojtek Majerski
9
Irgendwo auf der Welt stirbt ein Kätzchen für jeden regulären Ausdruck, den wir eigentlich nicht brauchen.
Gr.
Keine Erklärungen, keine Hinweise auf falsch positive / negative Ergebnisse, nur ein Teil des hier abgelegten Codes ... Diese Antwort sollte wirklich abgelehnt werden. Es ist nicht einmal eine Antwort auf DIE gestellte Frage.
Alexandre Germain
8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );
Naveen
quelle
3
Mir hat das gefallen, denken Sie daran, Sie können auch var is_chrome = /chrome/i.test(navigator.userAgent); Auch
AlanFoster
14
Gibt truein Microsoft Edge zurück.
Cobby
@Cobby: Bei allem Respekt wurde Edge zu diesem Zeitpunkt noch nicht veröffentlicht. Danke für die Info :)
Naveen
3

Möglicherweise möchten Sie auch die spezifische Version von Chrome:

var ua = navigator.userAgent;
if(/chrome/i.test(ua)) {
    var uaArray = ua.split(' ')
    ,   version = uaArray[uaArray.length - 2].substr(7);
}

Entschuldigung an The Big Lebowski für die Verwendung seiner Antwort in meiner.

MrOodles
quelle
4
Die Version ist "537.36"in Microsoft Edge.
Cobby
3

Sie können verwenden:

navigator.userAgent.indexOf("Chrome") != -1

Es arbeitet an v.71

magg89
quelle
navigator.userAgent.includes("Chrome")
Alex Szücs
2

Funktioniert für mich auf Chrome auf Mac. Scheint einfacher oder zuverlässiger zu sein (falls die userAgent-Zeichenfolge getestet wurde) als alle oben genannten.

        var isChrome = false;
        if (window.chrome && !window.opr){
            isChrome = true;
        }
        console.log(isChrome);
Yurin
quelle
2
const isChrome = window.chrome && !window.opr;
ifeelbadformyoldquestions
1

Benutzer kann Benutzeragent ändern. Versuchen Sie zum Testen webkitvorangestelltes Eigentum in styleObjekt von bodyElement

if ("webkitAppearance" in document.body.style) {
  // do stuff
}
guest271314
quelle
1
In Firefox: ("webkitAnimation" in document.body.style) === true
Tomas Prado
3
Zu Ihrer Information: 'webkitAppearance' funktioniert auch nicht mehr. Edge verwendet es jetzt. Am besten löschen Sie Ihre Antwort. ^^
Hexalys
0

Um die Namen verschiedener Desktop-Browser (Firefox, IE, Opera, Edge, Chrome) zu kennen. Außer Safari.

function getBrowserName() {
  var browserName = '';
  var userAgent = navigator.userAgent;
  (typeof InstallTrigger !== 'undefined') && (browserName = 'Firefox');
  ( /* @cc_on!@*/ false || !!document.documentMode) && (browserName = 'IE');
  (!!window.chrome && userAgent.match(/OPR/)) && (browserName = 'Opera');
  (!!window.chrome && userAgent.match(/Edge/)) && (browserName = 'Edge');
  (!!window.chrome && !userAgent.match(/(OPR|Edge)/)) && (browserName = 'Chrome');

  /**
   * Expected returns
   * Firefox, Opera, Edge, Chrome
   */
  return browserName;
}

Funktioniert in folgenden Browserversionen:

Opera - 58.0.3135.79
Firefox - 65.0.2 (64-bit)
IE - 11.413.15063 (JS Fiddle no longer supports IE just paste in Console)
Edge - 44.17763.1.0
Chrome - 72.0.3626.121 (Official Build) (64-bit)

Sehen Sie sich hier das Wesentliche und hier die Geige an

Das ursprüngliche Code-Snippet funktionierte nicht mehr für Chrome und ich habe vergessen, wo ich es gefunden habe. Es hatte vorher eine Safari, aber ich habe keinen Zugang mehr zur Safari, daher kann ich mich nicht mehr verifizieren.

Nur die Firefox- und IE-Codes waren Teil des ursprünglichen Snippets.

Die Überprüfung auf Opera, Edge und Chrome ist unkompliziert. Sie haben Unterschiede im userAgent. OPRexistiert nur in Opera. Edgeexistiert nur in Edge. Um nach Chrome zu suchen, sollte diese Zeichenfolge nicht vorhanden sein.

Was Firefox und IE betrifft, kann ich nicht erklären, was sie tun.

Ich werde diese Funktionalität einem Paket hinzufügen, das ich schreibe

iamdevlinph
quelle
-4

Alle Antworten sind falsch. "Opera" und "Chrome" sind in allen Fällen gleich.

(bearbeiteter Teil)

Hier ist die richtige Antwort

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}
Ararat Harutyunyan
quelle
1
Besserer Kommentar als eine Antwort.
Jace Cotton
Falls Sie sich fragen, warum Sie modifiziert wurden, ist dies einfach nicht wahr. Zum Beispiel behandeln sie Tastaturkürzel und greifen unterschiedlich auf Tastenmodifikatoren zu (und diese können auch nicht erkannt werden).
Zilk
Ich sage nicht, dass 'Oper' und 'Chrom' der gleiche Browser sind, nur das Symbol ist unterschiedlich. Ich sage, dass die oben beschriebenen Methoden für beide Browser das gleiche Ergebnis liefern.
Ararat Harutyunyan
@Zilk Hast du zum Beispiel die erste Antwort getestet, die 66 Stimmen hat?
Ararat Harutyunyan
9
Dies wird ab Chrom 71 nicht mehr funktionieren. Ist window.chrome.webstorejetztundefined
Esteban