JavaScript: Bagaimana cara mengetahui apakah browser pengguna adalah Chrome?

220

Saya perlu beberapa fungsi mengembalikan nilai boolean untuk memeriksa apakah browser itu Chrome .

Bagaimana cara membuat fungsi seperti itu?

Rella
sumber
16
Apakah Anda yakin tidak ingin melakukan deteksi fitur (alih-alih bertanya "apakah ini Chrome?" Tanya "bisakah ini melakukan yang saya butuhkan?")
bdukes
42
siapa tahu? dia mungkin ingin agar pengguna mengunduh ekstensi chrome
naveen
2
Pertanyaan ini menggambarkan masalah deteksi agen pengguna. Hanya tiga tahun kemudian, Latar Belakang Kotak 3D Menyenangkan akan (mencoba) memuat di Chrome ponsel kelas bawah saya tetapi bahkan tidak akan mencoba di Firefox di komputer desktop kelas atas saya.
Álvaro González
5
Saya setuju deteksi fitur adalah caranya. tetapi ada area yang sah di mana Anda ingin mendeteksi. misal saya ingin monkey patch xhr.sendAsBinary hanya untuk chrome. solusi awal saya diperiksa jika filereader.readasbinary diimplementasikan. namun, saya mengalami masalah saat tambalan untuk peramban seluler tertentu juga gagal diunggah. Saya ingin perbaikan ini hanya untuk chrome.
frostymarvelous
4
Ingin tahu mengapa mungkin relevan untuk mengetahui apakah browser adalah Chrome? Bagaimana dengan Chrome yang tidak dapat memuat umpan RSS? Jadi, alih-alih menautkan ke umpan RSS yang akan gagal dimuat di Chrome, Anda sebenarnya bisa memberikan peringatan atau mengarahkan ulang pengguna? Tidak, terima kasih untuk Anda Google Chrome ...
Pic Mickael

Jawaban:

205

Pembaruan: Silakan lihat jawaban Jonathan untuk cara yang diperbarui untuk menangani ini. Jawaban di bawah mungkin masih berfungsi, tetapi kemungkinan dapat memicu beberapa kesalahan positif di browser lain.

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

Namun, seperti yang disebutkan, Agen Pengguna dapat dipalsukan sehingga selalu terbaik untuk menggunakan pendeteksian fitur (mis. Modernizer ) saat menangani masalah ini, sebagaimana disebutkan oleh jawaban lain.

Rion Williams
sumber
apa alasan di balik penggunaan .toLowerCase - mengapa tidak hanya navigator.userAgent.indexOf ('Chrome') Saya melihat banyak orang menggunakannya tetapi saya tidak yakin intinya?
Jon
7
@Serg karena mereka tidak memiliki Chrome. Ini hanya kulit sekitar iOS Safari.
Poetro
2
Terima kasih, meskipun nama var Anda harus
camelCase
5
Karena banyak peramban mengembalikan true pada ini, inilah kode yang saya gunakan yang mengecualikan Edge, Maxthon, iOS safari ... dll var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.
2
Opera (setidaknya versi 42) kembali Google Incke navigator.vendor, jadi metode ini bukan antipeluru, sesuatu seperti /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)mungkin akan bekerja lebih baik
yorch
314

Untuk memeriksa apakah browser adalah Google Chrome , coba ini:

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

Contoh penggunaan: http://codepen.io/jonathan/pen/WpQELR

Alasan ini berhasil adalah karena jika Anda menggunakan inspektur Google Chrome dan pergi ke tab konsol. Ketik 'jendela' dan tekan enter. Kemudian Anda dapat melihat properti DOM untuk 'objek jendela'. Saat Anda menutup objek, Anda dapat melihat semua properti, termasuk properti 'chrome'.

Anda tidak dapat menggunakan benar-benar sama dengan benar lagi untuk memeriksa di IE window.chrome. IE digunakan untuk kembali undefined, sekarang kembali true. Tapi coba tebak, IE11 sekarang kembali tidak terdefinisi lagi. IE11 juga mengembalikan string kosong ""untuk window.navigator.vendor.

Saya harap ini membantu!

MEMPERBARUI:

Terima kasih kepada Halcyon991 karena telah menunjukkan di bawah ini, bahwa Opera 18+ yang baru juga menghasilkan true window.chrome. Sepertinya Opera 18 didasarkan pada Chromium 31 . Jadi saya menambahkan cek untuk memastikan window.navigator.vendoris: "Google Inc"and not is "Opera Software ASA". Juga terima kasih kepada Ring dan Adrien Be untuk informasi terbaru tentang Chrome 33 yang tidak kembali benar lagi ... window.chromesekarang periksa apakah tidak nol. Tapi perhatikan IE11, saya menambahkan cek kembali undefinedkarena IE11 sekarang mengeluarkan undefined, seperti yang dilakukan ketika pertama kali dirilis .. kemudian setelah beberapa pembaruan membangun di- output ke true.. sekarang pembaruan yang baru dibangun menghasilkan undefinedlagi. Microsoft tidak bisa mengatasinya!

PEMBARUAN 7/24/2015 - tambahan untuk pemeriksaan Opera

Opera 30 baru saja dirilis. Tidak ada lagi keluaran window.opera. Dan juga window.chromekeluaran true di Opera 30 yang baru. Jadi Anda harus memeriksa apakah OPR ada di UserAgent . Saya memperbarui kondisi saya di atas untuk memperhitungkan perubahan baru di Opera 30 ini, karena ia menggunakan mesin render yang sama seperti Google Chrome.

UPDATE 10/13/2015 - tambahan untuk pemeriksaan IE

Ditambahkan memeriksa untuk IE Edge karena itu keluaran trueuntuk window.chrome.. meskipun keluaran IE11 undefineduntuk window.chrome. Terima kasih kepada artfulhacker yang telah memberi tahu kami tentang ini!

UPDATE 2/5/2016 - tambahan untuk pemeriksaan iOS Chrome

Menambahkan cek untuk iOS Chrome cek CriOSkarena itu mengeluarkan trueuntuk Chrome di iOS. Terima kasih kepada xinthose yang telah memberi tahu kami tentang ini!

PEMBARUAN 4/18/2018 - ubah untuk pemeriksaan Opera

Diedit memeriksa untuk Opera, memeriksa window.oprtidak undefinedsejak sekarang Chrome 66 ada OPRdi window.navigator.vendor. Terima kasih kepada Frosty Z dan Daniel Wallman karena melaporkan ini!

Jonathan Marzullo
sumber
Ini tidak berfungsi untuk IE10. typeof window.chrome di IE10 mengembalikan {object}
magritte
2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Dering
1
Terima kasih @ xoseose .. Saya baru saja menambahkan cek untuk iOS Chrome .. sangat dihargai! :)
Jonathan Marzullo
2
Mungkin masalah yang sama dengan Daniel Wallman di sini: agen pengguna Android Chrome saya berisi 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, karenanya isChrome()mengembalikan false .
Frosty Z
2
Terima kasih @FrostyZ dan @DanielWallman karena memberi tahu kami. Aku tetap jadi cek Opera untuk window.oprtidak undefined.
Jonathan Marzullo
21

bahkan lebih pendek: var is_chrome = /chrome/i.test( navigator.userAgent );

Lebowski Besar
sumber
27
Kembali truedi Microsoft Edge.
Cobby
16

Solusi yang jauh lebih sederhana adalah dengan menggunakan:

var isChrome = !!window.chrome;

The !!hanya mengubah objek untuk nilai boolean. Di browser non-Chrome, properti ini adalahundefined , yang tidak benar.

Perhatikan ini juga mengembalikan true untuk versi Edge yang didasarkan pada Chrome (terima kasih @Carrm untuk menunjukkan ini).

Drew Noakes
sumber
5
Opera sebenarnya kembali trueke window.chrome. Lihat conditionizr.com yang memiliki deteksi + perbaikan antipeluru.
Halcyon991
7
Yah, Opera pada dasarnya adalah Chrome
Karel Bílek
Saya hanya tidak mengerti mengapa dua kali !! , Anda dapat langsung menggunakan, if (chrome) {}
Vishal Sharma
3
@vishalsharma, nilai !!konversi menjadi salah satu trueatau false. typeof(window.chrome)memberi "object", sedangkan typeof(!!window.chrome)memberi "boolean". Sampel kode Anda juga berfungsi juga karena ifpernyataan melakukan konversi.
Drew Noakes
1
Ini juga mengembalikan trueuntuk 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
sumber
Sayangnya, navigator.vendor === "Google Inc." pada Opera (setidaknya v.49) sehingga menggunakan kode Anda Opera muncul sebagai Chrome.
Wojtek Majerski
9
Di suatu tempat di dunia seekor anak kucing mati untuk setiap regex yang sebenarnya tidak kita butuhkan.
Sz.
Tidak ada penjelasan, tidak ada indikasi false positif / negatif, hanya sepotong kode yang dibuang di sini ... Respons ini harus benar-benar diturunkan. Itu bahkan bukan jawaban untuk pertanyaan yang diajukan.
Alexandre Germain
8
var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );
naveen
sumber
3
Saya suka ini, ingat Anda juga dapat melakukan var is_chrome = /chrome/i.test(navigator.userAgent); juga
AlanFoster
14
Kembali truedi Microsoft Edge.
Cobby
@Cobby: Dengan segala hormat, Edge tidak dirilis pada saat itu. Terima kasih atas informasinya :)
naveen
3

Anda mungkin juga menginginkan versi spesifik Chrome:

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

Permintaan maaf kepada The Big Lebowski karena menggunakan jawabannya di dalam jawabanku.

MrOodles
sumber
4
Versi ada "537.36"di Microsoft Edge.
Cobby
3

Kamu bisa memakai:

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

Ini bekerja pada v.71

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

Bekerja untuk saya di Chrome di Mac. Tampaknya atau lebih sederhana atau lebih dapat diandalkan (jika string userAgent diuji) daripada semua yang di atas.

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

Pengguna dapat mengubah agen pengguna. Coba pengujian untuk webkitproperti awalan di styleobjek bodyelemen

if ("webkitAppearance" in document.body.style) {
  // do stuff
}
guest271314
sumber
1
Di firefox: ("webkitAnimation" di document.body.style) === true
Tomas Prado
3
FYI: 'webkitAppearance' juga tidak berfungsi. Edge sekarang menggunakannya. Mungkin yang terbaik untuk menghapus jawaban Anda. ^^
hexalys
0

Untuk mengetahui nama-nama browser desktop yang berbeda (Firefox, IE, Opera, Edge, Chrome). Kecuali 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;
}

Bekerja di versi browser berikut:

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)

Lihat intinya di sini dan biola di sini

Cuplikan kode asli tidak lagi berfungsi untuk Chrome dan saya lupa di mana saya menemukannya. Itu memiliki safari sebelumnya, tetapi saya tidak lagi memiliki akses ke safari jadi saya tidak dapat memverifikasi lagi.

Hanya kode Firefox dan IE yang merupakan bagian dari cuplikan asli.

Pemeriksaan untuk Opera, Edge, dan Chrome benar. Mereka memiliki perbedaan dalam UserAgent. OPRhanya ada di Opera. Edgehanya ada di Edge. Jadi untuk memeriksa Chrome, string ini seharusnya tidak ada.

Sedangkan untuk Firefox dan IE, saya tidak bisa menjelaskan apa yang mereka lakukan.

Saya akan menambahkan fungsi ini ke paket yang saya tulis

iamdevlinph
sumber
-4

semua jawaban salah. "Opera" dan "Chrome" sama dalam semua kasus.

(bagian yang diedit)

inilah jawaban yang tepat

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}
Ararat Harutyunyan
sumber
1
Komentar yang lebih baik daripada jawaban.
Jace Cotton
Jika Anda bertanya-tanya mengapa Anda dimodelkan, ini sama sekali tidak benar. Misalnya, mereka menangani pintasan keyboard dan mengakses pengubah tombol secara berbeda (dan ini juga tidak dapat dideteksi fitur).
Zilk
Saya tidak mengatakan bahwa 'opera' dan 'chrome' adalah ikon browser yang sama saja. Saya mengatakan bahwa metode yang dijelaskan di atas memberikan hasil yang sama untuk kedua browser.
Ararat Harutyunyan
@Zilk Sudahkah Anda menguji misalnya jawaban pertama yang memiliki 66 suara?
Ararat Harutyunyan
9
Ini tidak lagi berfungsi pada chrome 71. window.chrome.webstoresekarangundefined
Esteban