JavaScript: como descobrir se o navegador do usuário é o Chrome?

220

Preciso de alguma função retornando um valor booleano para verificar se o navegador é Chrome .

Como crio essa funcionalidade?

Rella
fonte
16
Tem certeza de que não deseja fazer a detecção de recursos (em vez de perguntar "isso é Chrome?" Perguntar "isso é o que eu preciso?"))
bdukes
42
quem sabe? ele pode querer ter de download do usuário uma extensão do Chrome
Naveen
2
Esta pergunta ilustra o problema de detecção do agente do usuário. Apenas três anos depois, o Fun 3D Box Background (tentará) carregar no Chrome meu celular de baixo custo, mas nem tentará no Firefox no meu computador desktop de ponta.
Álvaro González
5
Concordo que a detecção de recursos é o caminho a percorrer. mas há áreas legítimas que você gostaria de detectar. Por exemplo, eu quero usar o patch de macaco xhr.sendAsBinary apenas para o Chrome. minha solução inicial verificou se filereader.readasbinary está implementado. no entanto, estou tendo problemas nos quais ele também corrige certos navegadores móveis e, portanto, o upload falha. Eu quero essa correção apenas para o chrome.
Frostymarvelous
4
Deseja saber por que pode ser relevante saber se um navegador é o Chrome? Que tal o Chrome não conseguir carregar feeds RSS? Para que, em vez de vincular a um feed RSS que falhe ao carregar no Chrome, você possa realmente fornecer um aviso ou redirecionar o usuário? Não graças a você Google Chrome ...
Pic Mickael

Respostas:

205

Atualização: consulte a resposta de Jonathan para obter uma maneira atualizada de lidar com isso. A resposta abaixo ainda pode funcionar, mas provavelmente pode desencadear alguns falsos positivos em outros navegadores.

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

No entanto, como mencionado, os agentes do usuário podem ser falsificados, portanto, é sempre melhor usar a detecção de recursos (por exemplo, modernizador ) ao lidar com esses problemas, como outras respostas mencionam.

Rion Williams
fonte
qual é o raciocínio por trás do uso de .toLowerCase - por que não apenas navigator.userAgent.indexOf ('Chrome') Vejo muita gente usá-lo, mas não sei ao certo?
31413 Jon
7
@Erg porque eles não têm o Chrome. É apenas uma aparência em torno do iOS Safari.
Poetro #
2
Graças, embora seu nome var deve ser camelCase
Dimitri Kopriwa
5
Uma vez que um monte de navegador retorna true para isso, aqui está o código que eu usei 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
O Opera (pelo menos versão 42) retorna Google Incpara navigator.vendor, portanto, esse método não é à prova de balas, algo como /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)provavelmente funcionaria melhor
yorch
314

Para verificar se o navegador é o Google Chrome , tente o seguinte:

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

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

O motivo disso funciona é porque, se você usar o inspetor do Google Chrome e acessar a guia do console. Digite 'janela' e pressione Enter. Então você poderá visualizar as propriedades do DOM para o 'objeto de janela'. Ao recolher o objeto, você pode visualizar todas as propriedades, incluindo a propriedade 'chrome'.

Você não pode mais usar estritamente igual a true para fazer check-in no IE window.chrome. O IE costumava retornar undefined, agora retorna true. Mas adivinhe, o IE11 agora retorna indefinido novamente. O IE11 também retorna uma sequência vazia ""parawindow.navigator.vendor .

Eu espero que isso ajude!

ATUALIZAR:

Obrigado a Halcyon991 por apontar abaixo, que o novo Opera 18+ também gera como verdadeiro window.chrome. Parece que o Opera 18 é baseado no Chromium 31 . Então eu adicionei uma verificação para garantir que window.navigator.vendoré: "Google Inc"e não é "Opera Software ASA". Também agradecemos a Ring e Adrien Be pelas informações sobre o Chrome 33 que não retornam mais verdade ... window.chromeagora verifica se não é nulo. Mas preste muita atenção ao IE11, adicionei a verificação de volta, undefinedjá que o IE11 agora undefinedé lançado, como foi o primeiro lançamento .. depois que alguma atualização é criada, ele é gerado true.. agora a atualização recente está sendo exibida undefinednovamente. A Microsoft não consegue se decidir!

ATUALIZAÇÃO 24/7/2015 - adição para verificação do Opera

O Opera 30 acabou de ser lançado. Não sai mais window.opera. E também window.chromegera true no novo Opera 30. Portanto, você deve verificar se o OPR está no userAgent . Atualizei minha condição acima para explicar essa nova alteração no Opera 30, pois ele usa o mesmo mecanismo de renderização do Google Chrome.

ATUALIZAÇÃO 13/10/2015 - adição para verificação do IE

Adicionada verificação para o IE Edge devido à saída truepara window.chrome.. mesmo que o IE11 produz undefinedpara window.chrome. Agradecemos a artfulhacker por nos informar sobre isso!

ATUALIZAÇÃO 5/5/2016 - adição à verificação do iOS Chrome

Adicionada verificação para iOS Chrome, CriOSdevido à saída truepara Chrome no iOS. Agradecemos a xinthose por nos informar sobre isso!

ATUALIZAÇÃO 18/04/2018 - alterar para verificação do Opera

Verificação editado para Opera, a verificação window.oprnão é undefineddesde agora Chrome 66 tem OPRno window.navigator.vendor. Agradecemos a Frosty Z e Daniel Wallman por reportarem isso!

Jonathan Marzullo
fonte
Isso não funciona para o IE10. typeof window.chrome no IE10 retorna {object}
magritte
2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Toque em
1
Obrigado @xinthose .. Acabei de adicionar um cheque para o IOS Chrome .. muito apreciado! :)
Jonathan Marzullo
2
Talvez o mesmo problema que Daniel Wallman aqui: meu agente do usuário do Android Chrome contenha a string "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, portanto, isChrome()retorna false .
gelado Z
2
Obrigado @FrostyZ e @DanielWallman por nos informar. Corrigi-o para que o Opera verifique que window.oprnão é undefined.
Jonathan Marzullo
21

ainda mais curto: var is_chrome = /chrome/i.test( navigator.userAgent );

The Big Lebowski
fonte
27
Retorno trueno Microsoft Edge.
Cobby 01/02
16

Uma solução muito mais simples é usar:

var isChrome = !!window.chrome;

O !!just converte o objeto em um valor booleano. Em navegadores não Chrome, essa propriedade seráundefined , o que não é verdade.

Observe que isso também retorna verdadeiro para versões do Edge baseadas no Chrome (obrigado @Carrm por apontar isso).

Drew Noakes
fonte
5
Opera realmente retorna truepara window.chrome. Confira o conditionizr.com que possui uma correção à prova de balas + detect.
precisa saber é o seguinte
7
Bem, Opera é basicamente Chrome embora
Karel Bílek
Eu só não entendo por que duas vezes !! , U pode usar diretamente, se (cromo) {}
Vishal Sharma
3
@vishalsharma, !!converte o valor para ser um trueou false. typeof(window.chrome)"object", enquanto typeof(!!window.chrome)"boolean". Seu exemplo de código também funciona porque a ifinstrução faz a conversão.
Drew Noakes
1
Isso também retorna truepara o 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
fonte
Infelizmente, navigator.vendor === "Google Inc." no Opera (pelo menos v.49), portanto, usar o código Opera aparece como Chrome.
Wojtek Majerski
9
Em algum lugar do mundo, um gatinho morre para cada regex que realmente não precisamos.
Sz.
Sem explicações, sem indicações sobre falsos positivos / negativos, apenas um pedaço de código despejado aqui ... Essa resposta deve ser realmente reduzida. Nem sequer é uma resposta para a pergunta.
Alexandre Germain
8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );
naveen
fonte
3
Eu gostei disso, lembre-se, você também pode fazer var is_chrome = /chrome/i.test(navigator.userAgent); também
AlanFoster
14
Retorna trueno Microsoft Edge.
Cobby 01/02
@ Cobby: Com todo o respeito, o Edge não foi lançado na época. Obrigado pela informação :)
naveen
3

Você também pode querer a versão específica do Chrome:

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

Desculpas a The Big Lebowski por usar sua resposta na minha.

MrOodles
fonte
4
A versão está "537.36"no Microsoft Edge.
Cobby 01/02
3

Você pode usar:

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

Está trabalhando na v.71

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

Funciona para mim no Chrome no Mac. Parece ser ou mais simples ou mais confiável (no caso de uma sequência de caracteres testada pelo userAgent) do que todas as anteriores.

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

O usuário pode alterar o agente do usuário. Tente testar a webkitpropriedade prefixada no styleobjeto de bodyelemento

if ("webkitAppearance" in document.body.style) {
  // do stuff
}
guest271314
fonte
1
No firefox: ("webkitAnimation" em document.body.style) === true
Tomas Prado
3
FYI: 'webkitAppearance' também não funciona. Agora o Edge está usando. Provavelmente é melhor excluir sua resposta. ^^
hexalys 29/04
0

Conhecer os nomes dos diferentes navegadores da área de trabalho (Firefox, IE, Opera, Edge, Chrome). Exceto o 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 nas seguintes versões do 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)

Veja a essência aqui e o violino aqui

O snippet de código original não funcionava mais no Chrome e esqueci onde o encontrei. Ele tinha safari antes, mas não tenho mais acesso ao safari, portanto não posso mais verificar.

Somente os códigos Firefox e IE faziam parte do snippet original.

A verificação do Opera, Edge e Chrome é simples. Eles têm diferenças no userAgent.OPRsó existe no Opera.Edgesó existe no Edge. Portanto, para verificar o Chrome, essa string não deve estar lá.

Quanto ao Firefox e IE, não sei explicar o que eles fazem.

Vou adicionar essa funcionalidade a um pacote que estou escrevendo

iamdevlinph
fonte
-4

todas as respostas estão erradas. "Opera" e "Chrome" são iguais em todos os casos.

(parte editada)

aqui está a resposta certa

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}
Ararat Harutyunyan
fonte
1
Melhor comentário do que uma resposta.
Jace Cotton
Caso você esteja se perguntando por que foi modificado, isso simplesmente não é verdade. Por exemplo, eles lidam com atalhos de teclado e acessam modificadores de teclas de maneira diferente (e eles também não podem ser detectados pelos recursos).
Zilk 27/05
Não digo que 'opera' e 'chrome' sejam o mesmo ícone do navegador, mas que sejam diferentes. Eu digo que os métodos descritos acima estão fornecendo o mesmo resultado para os dois navegadores.
Ararat Harutyunyan
@Zilk Você testou, por exemplo, a primeira resposta com 66 votos positivos?
Ararat Harutyunyan
9
Isso não funcionará mais a partir do chrome 71. window.chrome.webstoreagora é undefined
Esteban