JavaScript: ¿Cómo saber si el navegador del usuario es Chrome?

220

Necesito alguna función que devuelva un valor booleano para verificar si el navegador es Chrome .

¿Cómo creo tal funcionalidad?

Rella
fuente
16
¿Estás seguro de que usted no quiere hacer la detección de características en su lugar (en lugar de pedir a preguntar "¿puede esto hacer que necesito?" "¿Es esto Chrome?")
bdukes
42
¿quién sabe? puede querer que el usuario descargue una extensión de Chrome
naveen
2
Esta pregunta ilustra el problema de la detección del agente de usuario. Solo tres años más tarde, Fun 3D Box Background (intentará) cargar en Chrome mi teléfono móvil de gama baja, pero ni siquiera lo intentará en Firefox en mi computadora de escritorio de gama alta.
Álvaro González
55
Estoy de acuerdo en que la detección de características es el camino a seguir. pero hay áreas legítimas donde le gustaría detectar. por ejemplo, quiero parchear mono xhr.sendAsBinary solo para Chrome mi solución inicial verificó si filereader.readasbinary está implementado. sin embargo, tengo problemas en los parches para ciertos navegadores móviles y, por lo tanto, la carga falla. Quiero esta solución solo para Chrome.
frostymarvelous
44
¿Quiere saber por qué podría ser relevante saber si un navegador es Chrome? ¿Qué tal si Chrome no puede cargar canales RSS? Entonces, ¿en lugar de vincular a una fuente RSS que no se cargará en Chrome, en realidad podría proporcionar una advertencia o redirigir al usuario? No, gracias a ti Google Chrome ...
Pic Mickael

Respuestas:

205

Actualización: consulte la respuesta de Jonathan para obtener una forma actualizada de manejar esto. La respuesta a continuación aún puede funcionar, pero probablemente podría desencadenar algunos falsos positivos en otros navegadores.

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

Sin embargo, como se mencionó, los Agentes de usuarios pueden ser falsificados, por lo que siempre es mejor usar la detección de funciones (por ejemplo, Modernizador ) al manejar estos problemas, como mencionan otras respuestas.

Rion Williams
fuente
¿Cuál es el razonamiento detrás del uso de .toLowerCase? ¿Por qué no solo navigator.userAgent.indexOf ('Chrome') veo que mucha gente lo usa pero no estoy seguro del punto?
Jon
77
@Serg porque no tienen Chrome. Es solo una máscara alrededor de iOS Safari.
Poetro
2
Gracias, aunque su nombre var debería ser camelCase
Dimitri Kopriwa
55
Dado que muchos navegadores devuelven el valor verdadero en esto, aquí está el código que utilicé que excluía Edge, Maxthon, iOS safari ... etc. var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.
2
Opera (al menos la versión 42) vuelve Google Inca navigator.vendor, por lo que este método no es a prueba de balas, algo así como /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)probablemente funcione mejor
yorch
314

Para verificar si el navegador es Google Chrome , intente esto:

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

Ejemplo de uso: http://codepen.io/jonathan/pen/WpQELR

La razón por la que esto funciona es porque si usas el inspector de Google Chrome y vas a la pestaña de la consola. Escriba 'ventana' y presione Entrar. Luego podrá ver las propiedades DOM para el 'objeto de ventana'. Cuando contrae el objeto, puede ver todas las propiedades, incluida la propiedad 'chrome'.

Ya no puede usar estrictamente igual verdadero para verificar IE window.chrome. IE solía volver undefined, ahora vuelve true. Pero adivina qué, IE11 ahora vuelve indefinido nuevamente. IE11 también devuelve una cadena vacía ""para window.navigator.vendor.

¡Espero que esto ayude!

ACTUALIZAR:

Gracias a Halcyon991 por señalar a continuación, que el nuevo Opera 18+ también resulta verdadero window.chrome. Parece que Opera 18 se basa en Chromium 31 . Así que agregué un cheque para asegurarme de que window.navigator.vendores: "Google Inc"y no es "Opera Software ASA". También gracias a Ring y Adrien Be por el aviso de que Chrome 33 ya no es verdad ...window.chrome ahora comprueba si no es nulo. Pero preste mucha atención a IE11, agregué la verificación de nuevo undefinedya que IE11 ahora sale undefined, como lo hizo cuando se lanzó por primera vez ... luego, después de algunas compilaciones de actualización, salió a true... ahora la compilación de actualización reciente está undefinedvolviendo a salir . ¡Microsoft no puede decidirse!

ACTUALIZAR 24/07/2015 - adición para Opera Check

Opera 30 acaba de ser lanzado. Ya no sale window.opera. Y también window.chromesale a verdadero en el nuevo Opera 30. Por lo tanto, debe verificar si OPR está en el UserAgent . Actualicé mi condición anterior para tener en cuenta este nuevo cambio en Opera 30, ya que utiliza el mismo motor de renderizado que Google Chrome.

ACTUALIZAR 13/10/2015 - adición para verificación IE

Comprobación adicional para IE Edge debido a que genera truepara window.chrome... aunque IE11 genera undefinedpara window.chrome. Gracias a artfulhacker por sobre esto!

ACTUALIZAR 2/5/2016 - adición para iOS Chrome check

Comprobación agregada para la comprobación de Chrome de iOS CriOSdebido a su salida truepara Chrome en iOS. Gracias a xinthose por sobre esto!

ACTUALIZACIÓN 18/04/2018 - cambio para cheque Opera

Cheque editado para Opera, la comprobación window.oprno es undefinedya que ahora Chrome 66 tiene OPRen window.navigator.vendor. ¡Gracias a Frosty Z y Daniel Wallman por informar esto!

Jonathan Marzullo
fuente
Esto no funciona para IE10. typeof window.chrome en IE10 devuelve {objeto}
magritte
2
var isGoogleChrome = window.chrome! = nulo && window.navigator.vendor === "Google Inc.";
Anillo
1
Gracias @xinthose ... Acabo de agregar un cheque para IOS Chrome ... ¡muy apreciado! :)
Jonathan Marzullo
2
Tal vez el mismo problema que Daniel Wallman aquí: mi agente de usuario de Android Chrome contiene la cadena "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, por lo tanto, isChrome()devuelve falso .
Frosty Z
2
Gracias @FrostyZ y @DanielWallman por informarnos. Lo arreglé para que Opera compruebe si window.oprno lo está undefined.
Jonathan Marzullo
21

incluso más corto: var is_chrome = /chrome/i.test( navigator.userAgent );

El gran lebowski
fuente
27
Regreso trueen Microsoft Edge.
Cobby
16

Una solución mucho más simple es simplemente usar:

var isChrome = !!window.chrome;

El !!justo convierte el objeto en un valor booleano. En los navegadores que no sean Chrome, esta propiedad será undefined, lo que no es cierto.

Tenga en cuenta que esto también es válido para las versiones de Edge que se basan en Chrome (gracias @Carrm por señalar esto).

Drew Noakes
fuente
55
Opera realmente regresa truea window.chrome. Echa un vistazo a conditionizr.com, que tiene una detección y reparación a prueba de balas.
Halcyon991
77
Bueno, Opera es básicamente Chrome, sin embargo
Karel Bílek
¡No entiendo por qué dos veces! , puedes usar directamente, if (chrome) {}
Vishal Sharma
3
@vishalsharma, !!convierte el valor en trueo false. typeof(window.chrome)da "object", mientras que typeof(!!window.chrome)da "boolean". Su ejemplo de código también funciona porque la ifdeclaración hace la conversión.
Drew Noakes
1
Esto también regresa truepara 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, '  '));

Josef Ježek
fuente
Desafortunadamente, navigator.vendor === "Google Inc." en Opera (al menos v.49), por lo que el uso de su código Opera aparece como Chrome.
Wojtek Majerski
99
En algún lugar del mundo muere un gatito por cada expresión regular que realmente no necesitamos.
Sz.
Sin explicaciones, sin indicaciones sobre falsos positivos / negativos, solo un fragmento de código arrojado aquí ... Esta respuesta realmente debería ser rechazada. Ni siquiera es una respuesta a LA pregunta formulada.
Alexandre Germain
8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );
naveen
fuente
3
Me gustó esto, recuerda que también puedes hacer var is_chrome = /chrome/i.test(navigator.userAgent); también
AlanFoster
14
Devoluciones trueen Microsoft Edge.
Cobby
@Cobby: Con el debido respeto, Edge no se lanzó en ese momento. Gracias por la información :)
naveen 01 de
3

También es posible que desee la versión específica de Chrome:

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

Disculpas a The Big Lebowski por usar su respuesta dentro de la mía.

MrOodles
fuente
44
La versión está "537.36"en Microsoft Edge.
Cobby
3

Puedes usar:

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

Está trabajando en v.71

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

Funciona para mí en Chrome en Mac. Parece ser más simple o más confiable (en caso de que la cadena de UserAgent haya sido probada) que todas las anteriores.

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

El usuario puede cambiar el agente de usuario. Intente probar la webkitpropiedad prefijada en el styleobjeto del bodyelemento

if ("webkitAppearance" in document.body.style) {
  // do stuff
}
invitado271314
fuente
1
En firefox: ("webkitAnimation" en document.body.style) === verdadero
Tomas Prado
3
FYI: 'webkitAppearance' ya no funciona tampoco. Edge ahora lo está usando. Probablemente sea mejor eliminar tu respuesta. ^^
hexalys
0

Conocer los nombres de los diferentes navegadores de escritorio (Firefox, IE, Opera, Edge, Chrome). Excepto 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;
}

Funciona en las siguientes versiones de navegador:

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)

Vea la esencia aquí y el violín aquí

El fragmento de código original ya no funcionaba para Chrome y olvidé dónde lo encontré. Antes tenía un safari, pero ya no tengo acceso al safari, así que ya no puedo verificarlo.

Solo los códigos Firefox e IE eran parte del fragmento original.

La comprobación de Opera, Edge y Chrome es sencilla. Tienen diferencias en el UserAgent. OPRsolo existe en Opera. Edgesolo existe en Edge. Entonces, para verificar Chrome, esta cadena no debería estar allí.

En cuanto a Firefox e IE, no puedo explicar lo que hacen.

Agregaré esta funcionalidad a un paquete que estoy escribiendo

iamdevlinph
fuente
-4

Todas las respuestas son incorrectas. "Opera" y "Chrome" son iguales en todos los casos.

(parte editada)

aquí está la respuesta correcta

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}
Ararat Harutyunyan
fuente
1
Mejor comentario que una respuesta.
Jace Cotton
En caso de que se pregunte por qué se modificó, esto simplemente no es cierto. Por ejemplo, manejan los atajos de teclado y acceden a los modificadores de teclas de manera diferente (y tampoco se pueden detectar funciones).
Zilk
No digo que 'opera' y 'chrome' sean el mismo ícono, solo el navegador es diferente. Digo que los métodos descritos anteriormente están dando el mismo resultado para ambos navegadores.
Ararat Harutyunyan
@Zilk ¿Has probado, por ejemplo, la primera respuesta que tiene 66 votos?
Ararat Harutyunyan
99
Esto ya no funcionará a partir del cromo 71. window.chrome.webstoreahora esundefined
Esteban