JavaScript: come scoprire se il browser dell'utente è Chrome?


220

Ho bisogno di alcune funzioni che restituiscono un valore booleano per verificare se il browser lo è Chrome .

Come posso creare tale funzionalità?


16
Sei sicuro di non voler invece effettuare il rilevamento delle funzionalità (invece di chiedere "è questo Chrome?"
Chiedi

42
chissà? potrebbe desiderare che l'utente scarichi un'estensione di Chrome
naveen il

2
Questa domanda illustra il problema del rilevamento dell'agente utente. Solo tre anni dopo, Fun 3D Box Background (tenterà di) caricare in Chrome il mio cellulare di fascia bassa ma non proverà nemmeno in Firefox nel mio computer desktop di fascia alta.
Álvaro González,

5
Sono d'accordo che il rilevamento delle funzionalità è la strada da percorrere. ma ci sono aree legittime che vorresti rilevare. ad es. voglio scimmia patch xhr.sendAsBinary solo per Chrome. la mia soluzione iniziale ha verificato se è implementato filereader.readasbinary. tuttavia, sto riscontrando problemi in cui corre patch anche per alcuni browser mobili e quindi il caricamento non riesce. Voglio questa soluzione solo per Chrome.
frostymarvelous,

4
Vuoi sapere perché potrebbe essere rilevante sapere se un browser è Chrome? Che ne dici di Chrome non essere in grado di caricare feed RSS? In modo che invece di collegarti a un feed RSS che non verrà caricato in Chrome, potresti effettivamente fornire un avviso o reindirizzare l'utente? No grazie a te Google Chrome ...
Pic Mickael,

Risposte:


205

Aggiornamento: consultare la risposta di Jonathan per un modo aggiornato di gestirlo. La risposta che segue potrebbe ancora funzionare, ma potrebbe innescare alcuni falsi positivi in ​​altri browser.

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

Tuttavia, come indicato, gli agenti utente possono essere falsificati, quindi è sempre meglio utilizzare il rilevamento delle funzionalità (ad es. Modernizer ) quando si gestiscono questi problemi, come menzionano altre risposte.


qual è il ragionamento alla base dell'utilizzo di .toLowerCase - perché non solo navigator.userAgent.indexOf ('Chrome') Vedo che molte persone lo usano ma non ne sono sicuro?
Jon

7
@Serg perché non hanno Chrome. È solo una skin per iOS Safari.
Poetro,

2
Grazie, anche se il tuo nome var dovrebbe essere camelCase
Dimitri Kopriwa,

5
Dato che molti browser tornano veri in questo, ecco il codice che ho usato che escludeva Edge, Maxthon, iOS Safari ... ecc. var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.

2
Opera (almeno la versione 42) torna Google Inca navigator.vendor, quindi questo metodo non è a prova di proiettile, qualcosa del genere /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)probabilmente funzionerebbe meglio
yorch

314

Per verificare se il browser è Google Chrome , prova questo:

// 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 
}

Esempio di utilizzo: http://codepen.io/jonathan/pen/WpQELR

Il motivo per cui funziona è perché se usi la finestra di ispezione di Google Chrome e vai alla scheda della console. Digita "finestra" e premi invio. Quindi sarai in grado di visualizzare le proprietà DOM per l '"oggetto finestra". Quando si comprime l'oggetto è possibile visualizzare tutte le proprietà, inclusa la proprietà 'chrome'.

Non è più possibile utilizzare rigorosamente uguale a true per verificare in IE window.chrome. IE era solito tornare undefined, ora ritorna true. Ma indovina un po ', IE11 ora torna di nuovo indefinito. IE11 restituisce anche una stringa vuota ""per window.navigator.vendor.

Spero che aiuti!

AGGIORNARE:

Grazie a Halcyon991 per aver sottolineato di seguito, che anche la nuova Opera 18+ viene trasmessa su true window.chrome. Sembra che Opera 18 sia basato su Chromium 31 . Quindi ho aggiunto un segno di spunta per assicurarmi che window.navigator.vendoris: "Google Inc"and not is "Opera Software ASA". Anche grazie a Ring e Adrien Be per il testa a testa su Chrome 33 che non torna più vero ... window.chromeora controlla se non nullo. Ma fai molta attenzione a IE11, ho aggiunto il check back undefinedpoiché IE11 ora viene emesso undefined, come ha fatto quando è stato rilasciato per la prima volta .. poi dopo alcuni build di aggiornamento è stato emesso su true... ora la build di aggiornamento recente viene undefinednuovamente lanciata . Microsoft non riesce a decidersi!

AGGIORNAMENTO 24/07/2015 - aggiunta per Opera check

Opera 30 è stata appena rilasciata. Non viene più emesso window.opera. E anche window.chromeoutput su true nel nuovo Opera 30. Quindi è necessario verificare se OPR è in userAgent . Ho aggiornato le mie condizioni sopra per tenere conto di questa nuova modifica in Opera 30, poiché utilizza lo stesso motore di rendering di Google Chrome.

AGGIORNAMENTO 13/10/2015 - aggiunta per controllo IE

Aggiunto controllo per IE Edge grazie alla sua uscita trueper window.chrome.. anche se le uscite IE11 undefinedper window.chrome. Grazie ad artfulhacker per averci fatto sapere questo!

AGGIORNAMENTO 2/5/2016 - aggiunta per iOS Chrome check

Aggiunto controllo per iOS Chrome check CriOSgrazie alla sua uscita trueper Chrome su iOS. Grazie a xinthose per averci informato di questo!

AGGIORNAMENTO 18/04/2018 - modifica per il controllo Opera

A cura di controllo per Opera, il controllo window.oprnon è undefineddato che ora Chrome 66 ha OPRin window.navigator.vendor. Grazie a Frosty Z e Daniel Wallman per aver segnalato questo!


Questo non funziona per IE10. typeof window.chrome in IE10 restituisce {oggetto}
magritte

2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Anello il

1
Grazie @xinthose .. Ho appena aggiunto un assegno per IOS Chrome .. molto apprezzato! :)
Jonathan Marzullo,

2
Forse lo stesso problema di Daniel Wallman qui: il mio agente utente Android Chrome contiene la stringa "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.36, pertanto isChrome()restituisce false .
Frosty Z,

2
Grazie @FrostyZ e @DanielWallman per averci fatto sapere. L'ho risolto, quindi i controlli di Opera window.oprnon lo sono undefined.
Jonathan Marzullo,


16

Una soluzione molto più semplice è solo per usare:

var isChrome = !!window.chrome;

Il !!just converte l'oggetto in un valore booleano. Nei browser non Chrome, questa proprietà sarà undefined, il che non è vero.

Nota che questo vale anche per le versioni di Edge basate su Chrome (grazie a @Carrm per averlo segnalato).


5
Opera in realtà torna truea window.chrome. Scopri conditionizr.com che ha un rilevamento + correzione a prova di proiettile.
Halcyon991,

7
Bene, però, Opera è praticamente Chrome
Karel Bílek il

Solo non capisco perché due volte !! , puoi utilizzare direttamente, se (chrome) {}
Vishal Sharma,

3
@vishalsharma, il !!converte il valore in uno trueo false. typeof(window.chrome)"object", mentre typeof(!!window.chrome)"boolean". L'esempio di codice funziona anche perché l' ifistruzione esegue la conversione.
Drew Noakes,

1
Questo ritorna anche trueper Edge.
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, '  '));


Sfortunatamente, navigator.vendor === "Google Inc." su Opera (almeno v.49), quindi usando il tuo codice Opera appare come Chrome.
Wojtek Majerski il

9
In qualche parte del mondo un gattino muore per ogni regex di cui in realtà non abbiamo bisogno.
Sz.

Nessuna spiegazione, nessuna indicazione su falsi positivi / negativi, solo un pezzo di codice scaricato qui ... Questa risposta dovrebbe essere davvero ridotta. Non è nemmeno una risposta alla domanda posta.
Alexandre Germain,

8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );

3
Mi è piaciuto, ricorda che puoi anche fare var is_chrome = /chrome/i.test(navigator.userAgent); anche
AlanFoster il

14
Restituisce truein Microsoft Edge.
Cobby

@Cobby: con tutto il rispetto, Edge non è stato rilasciato al momento. Grazie per l'informazione :)
naveen,

3

Puoi anche desiderare la versione specifica di Chrome:

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

Mi scuso con The Big Lebowski per aver usato la sua risposta nella mia.


4
La versione è "537.36"in Microsoft Edge.
Cobby

3

Puoi usare:

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

Funziona su v.71


navigator.userAgent.includes("Chrome")
Alex Szücs,

2

Funziona per me su Chrome su Mac. Sembra essere o più semplice o più affidabile (nel caso in cui la stringa UserAgent sia stata testata) di tutto quanto sopra.

        var isChrome = false;
        if (window.chrome && !window.opr){
            isChrome = true;
        }
        console.log(isChrome);

2
const isChrome = window.chrome && !window.opr;
ifeelbadformyoldquestions,

1

L'utente potrebbe cambiare l'agente utente. Prova a testare la webkitproprietà con prefisso stylenell'oggetto bodydell'elemento

if ("webkitAppearance" in document.body.style) {
  // do stuff
}

1
In firefox: ("webkitAnimation" in document.body.style) === true
Tomas Prado,

3
Cordiali saluti: 'webkitAppearance' non funziona più neanche. Edge ora lo sta usando. Probabilmente è meglio eliminare la tua risposta. ^^
hexalys,


0

Conoscere i nomi di diversi browser desktop (Firefox, IE, Opera, Edge, Chrome). Tranne 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;
}

Funziona nelle seguenti versioni del browser:

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)

Guarda l'essenza qui e il violino qui

Lo snippet di codice originale non funzionava più per Chrome e ho dimenticato dove l'ho trovato. Prima aveva un safari ma non ho più accesso al safari, quindi non posso più verificarlo.

Solo i codici Firefox e IE facevano parte dello snippet originale.

Il controllo per Opera, Edge e Chrome è diretto. Hanno differenze in userAgent. OPResiste solo in Opera.Edgeesiste solo in Edge. Quindi per verificare la presenza di Chrome questa stringa non dovrebbe essere lì.

Per quanto riguarda Firefox e IE, non posso spiegare cosa fanno.

Aggiungerò questa funzionalità a un pacchetto che sto scrivendo


-4

tutte le risposte sono sbagliate. "Opera" e "Chrome" sono uguali in tutti i casi.

(parte modificata)

ecco la risposta giusta

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}

1
Migliore commento di una risposta.
Jace Cotton,

Nel caso ti stia chiedendo perché sei stato modificato, semplicemente non è vero. Ad esempio, gestiscono le scorciatoie da tastiera e accedono ai modificatori dei tasti in modo diverso (e anche questi non possono essere rilevati in base alla funzione).
Zilk,

Non dico che "opera" e "chrome" siano lo stesso browser, solo l'icona è diversa. Dico che i metodi sopra descritti stanno dando lo stesso risultato per entrambi i browser.
Ararat Harutyunyan

@Zilk Hai provato ad esempio la prima risposta che ha 66 voti positivi?
Ararat Harutyunyan

9
Questo non funzionerà più a partire da Chrome 71. window.chrome.webstoreè oraundefined
Esteban il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.