JavaScript: Làm thế nào để tìm hiểu xem trình duyệt người dùng có phải là Chrome không?


220

Tôi cần một số chức năng trả về giá trị boolean để kiểm tra xem trình duyệt có phải là Chrome không .

Làm thế nào để tôi tạo chức năng như vậy?


16
Bạn có chắc chắn rằng bạn không muốn thực hiện phát hiện tính năng thay vào đó (thay vì hỏi "đây có phải là Chrome không?" Hãy hỏi "điều này tôi có thể làm không?")
bdukes

42
ai biết? anh ta có thể muốn người dùng tải xuống tiện ích chrome
naveen

2
Câu hỏi này minh họa vấn đề phát hiện tác nhân người dùng. Chỉ ba năm sau, Nền hộp 3D vui nhộn sẽ (cố gắng) tải vào Chrome điện thoại di động cấp thấp của tôi nhưng thậm chí sẽ không thử dùng Firefox trong máy tính để bàn cao cấp của tôi.
Álvaro González

5
Tôi đồng ý phát hiện tính năng là cách để đi. nhưng có những khu vực hợp pháp mà bạn muốn phát hiện. ví dụ: tôi muốn vá khỉ xhr.sendAsBinary chỉ cho chrome. giải pháp ban đầu của tôi đã được kiểm tra nếu filereader.readasbinary được triển khai. tuy nhiên, tôi cũng gặp vấn đề khi nó vá cho một số trình duyệt di động nhất định và do đó tải lên không thành công. Tôi muốn sửa lỗi này chỉ cho chrome.
frostymarvelous

4
Bạn muốn biết lý do tại sao có thể có liên quan để biết liệu trình duyệt có phải là Chrome không? Làm thế nào về Chrome không thể tải nguồn cấp RSS? Vì vậy, thay vì liên kết đến nguồn cấp RSS sẽ không tải được trong Chrome, bạn thực sự có thể cung cấp cảnh báo hoặc chuyển hướng người dùng? Không, cảm ơn bạn Google Chrome ...
Pic Mickael

Câu trả lời:


205

Cập nhật: Vui lòng xem câu trả lời của Jonathan để biết cách cập nhật để xử lý việc này. Câu trả lời dưới đây có thể vẫn hoạt động, nhưng nó có thể kích hoạt một số dương tính giả trong các trình duyệt khác.

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

Tuy nhiên, như Đại lý người dùng đã đề cập có thể bị giả mạo, vì vậy, tốt nhất là sử dụng tính năng phát hiện tính năng (ví dụ: Modernizer ) khi xử lý các vấn đề này, như các câu trả lời khác đề cập.


lý do đằng sau việc sử dụng .toLowerCase - tại sao không chỉ là navigator.userAgent.indexOf ('Chrome') Tôi thấy rất nhiều người sử dụng nó nhưng tôi không chắc chắn về vấn đề này?
Jon

7
@Serg vì họ không có Chrome. Nó chỉ là một giao diện xung quanh iOS Safari.
Poetro

2
Cảm ơn, mặc dù tên var của bạn phải là camelCase
Dimitri Kopriwa

5
Vì rất nhiều trình duyệt trả về đúng như vậy, đây là mã tôi đã sử dụng loại trừ Edge, Maxthon, iOS safari ... vv var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.

2
Opera (ít nhất là phiên bản 42) lợi nhuận Google Incđể navigator.vendor, vì vậy phương pháp này không phải là tuyệt đối, giống như /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)có lẽ làm việc tốt hơn
yorch

314

Để kiểm tra xem trình duyệt có phải là Google Chrome hay không , hãy thử điều này:

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

Ví dụ về việc sử dụng: http://codepen.io/jonathan/pen/WpQELR

Lý do điều này hoạt động là vì nếu bạn sử dụng trình kiểm tra Google Chrome và chuyển đến tab bảng điều khiển. Nhập 'window' và nhấn enter. Sau đó, bạn có thể xem các thuộc tính DOM cho 'đối tượng cửa sổ'. Khi bạn thu gọn đối tượng, bạn có thể xem tất cả các thuộc tính, bao gồm cả thuộc tính 'chrome'.

Bạn không thể sử dụng đúng bằng đúng nữa để kiểm tra trong IE window.chrome. IE dùng để trả về undefined, bây giờ nó trả về true. Nhưng đoán xem, IE11 bây giờ trả lại không xác định một lần nữa. IE11 cũng trả về một chuỗi rỗng"" cho window.navigator.vendor.

Tôi hi vọng cái này giúp được!

CẬP NHẬT:

Cảm ơn Halcyon991 vì đã chỉ ra bên dưới, rằng Opera 18+ mới cũng cho kết quả đúng window.chrome. Có vẻ như Opera 18 dựa trên Chromium 31 . Vì vậy, tôi đã thêm một kiểm tra để đảm bảo rằng window.navigator.vendor: "Google Inc"và không phải là "Opera Software ASA". Ngoài ra, cảm ơn RingAdrien Be vì đã đề cập đến việc Chrome 33 không trở lại đúng nữa ... window.chromebây giờ hãy kiểm tra xem có phải không. Nhưng hãy chú ý đến IE11, tôi đã thêm kiểm tra lại undefinedvì IE11 bây giờ xuất ra undefined, giống như khi nó được phát hành lần đầu tiên .. sau đó, một số bản cập nhật được xây dựng để xuất truehiện .. hiện tại bản dựng bản cập nhật mới xuất hiệnundefined lại . Microsoft không thể quyết định được!

CẬP NHẬT 24/07/2015 - bổ sung cho kiểm tra Opera

Opera 30 vừa được phát hành. Nó không còn đầu ra window.opera. Và cũng window.chromexuất ra đúng trong Opera 30 mới. Vì vậy, bạn phải kiểm tra xem OPR có trong userAgent không . Tôi đã cập nhật điều kiện của mình ở trên để giải thích cho sự thay đổi mới này trong Opera 30, vì nó sử dụng cùng một công cụ kết xuất như Google Chrome.

CẬP NHẬT 10/13/2015 - bổ sung cho kiểm tra IE

Đã thêm kiểm tra cho IE Edge do nó xuất ra truecho window.chrome.. mặc dù đầu ra IE11 undefinedcho window.chrome. Cảm ơn nghệ sĩ cho chúng tôi biết về điều này!

CẬP NHẬT 2/5/2016 - bổ sung cho kiểm tra Chrome của iOS

Đã thêm kiểm tra cho iOS Chrome kiểm tra CriOSdo nó xuất ra truecho Chrome trên iOS. Cảm ơn xinthose cho chúng tôi biết về điều này!

CẬP NHẬT 18/8/2018 - thay đổi để kiểm tra Opera

Kiểm tra sửa cho Opera, kiểm tra window.oprkhông phải là undefinedkể từ bây giờ Chrome 66 có OPRtrong window.navigator.vendor. Cảm ơn Frosty ZDaniel Wallman đã báo cáo điều này!


Điều này không hoạt động cho IE10. typeof window.chrom trong IE10 trả về {object}
magritte

2
var isGoogleChrom = window.chrom! = null && window.navigator.vendor === "Google Inc.";
Đổ chuông

1
Cảm ơn @xinthose .. Tôi vừa thêm một kiểm tra cho iOS Chrome .. được đánh giá cao! :)
Jonathan Marzullo

2
Có thể vấn đề tương tự như Daniel Wallman ở đây: tác nhân người dùng Android Chrome của tôi chứa chuỗi "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, do đó isChrome()trả về false .
Frosty Z

2
Cảm ơn bạn @FrostyZ và @DanielWallman đã cho chúng tôi biết. Tôi cố định nó để kiểm tra Opera cho window.oprkhông undefined.
Jonathan Marzullo

21

thậm chí ngắn hơn: var is_chrome = /chrome/i.test( navigator.userAgent );


27
Quay trở lại truetrong Microsoft Edge.
Cobby

16

Một giải pháp đơn giản hơn nhiều chỉ là sử dụng:

var isChrome = !!window.chrome;

Chỉ !!cần chuyển đổi đối tượng thành một giá trị boolean. Trong các trình duyệt không phải Chrome, thuộc tính này sẽ undefinedkhông đúng sự thật.

Lưu ý rằng điều này cũng trả về đúng cho các phiên bản Edge dựa trên Chrome (cảm ơn @Carrm vì đã chỉ ra điều này).


5
Opera thực sự trả về trueđể window.chrome. Kiểm tra conditionizr.com có ​​phát hiện chống đạn + sửa lỗi.
Halcyon991

7
Chà, Opera về cơ bản là Chrome
Karel Bílek

Tôi chỉ không hiểu tại sao hai lần !! , bạn có thể trực tiếp sử dụng, nếu (chrome) {}
Vishal Sharma

3
@vishalsharma, !!chuyển đổi giá trị thành truehoặc false. typeof(window.chrome)cho "object", trong khi typeof(!!window.chrome)cho "boolean". Mẫu mã của bạn cũng hoạt động vì ifcâu lệnh thực hiện chuyển đổi.
Drew Noakes

1
Điều này cũng trả về truecho 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, '  '));


Thật không may, navigator.vendor === "Google Inc." trên Opera (ít nhất là v.49) vì vậy sử dụng mã Opera của bạn sẽ xuất hiện dưới dạng Chrome.
Wojtek Majerski

9
Một nơi nào đó trên thế giới một chú mèo con chết vì mọi cuộc sống mà chúng ta không thực sự cần.
Sz.

Không có lời giải thích, không có dấu hiệu nào về sự tích cực / tiêu cực sai, chỉ là một đoạn mã bị bỏ ở đây ... Phản hồi này thực sự cần được hạ cấp. Nó thậm chí không phải là một câu trả lời cho câu hỏi.
Alexandre Germain

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

3
Tôi thích điều này, hãy nhớ rằng bạn cũng có thể thực hiện var is_chrom = /chrom/i.test(navigator.userAgent); quá
AlanFoster

14
Trả về truetrong Microsoft Edge.
Cobby

@ COB: Với tất cả sự tôn trọng, Edge không được phát hành vào thời điểm đó. Cảm ơn thông tin :)
naveen

3

Bạn cũng có thể muốn phiên bản cụ thể của Chrome:

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

Xin lỗi The Big Lebowski vì đã sử dụng câu trả lời của anh ấy trong tôi.


4
Phiên bản nằm "537.36"trong Microsoft Edge.
Cobby

3

Bạn có thể dùng:

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

Nó đang làm việc trên v.71


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

2

Hoạt động với tôi trên Chrome trên Mac. Có vẻ là hoặc đơn giản hơn hoặc đáng tin cậy hơn (trong trường hợp chuỗi userAgent được kiểm tra) so với tất cả ở trên.

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

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

1

Người dùng có thể thay đổi tác nhân người dùng. Hãy thử kiểm tra webkitthuộc tính tiền tố trong styleđối tượng của bodyphần tử

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

1
Trong firefox: ("webkitAnimation" trong document.body.style) === true
Tomas Prado

3
FYI: 'webkitAppurdy' cũng không còn hoạt động. Edge hiện đang sử dụng nó. Có lẽ tốt nhất để xóa câu trả lời của bạn. ^^
hexalys


0

Để biết tên của các trình duyệt máy tính để bàn khác nhau (Firefox, IE, Opera, Edge, Chrome). Ngoại trừ 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;
}

Hoạt động trong các phiên bản trình duyệt sau:

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)

Xem ý chính ở đây và fiddle ở đây

Đoạn mã gốc không còn hoạt động cho Chrome và tôi đã quên nơi tôi tìm thấy nó. Nó đã có safari trước đây nhưng tôi không còn quyền truy cập safari nữa nên tôi không thể xác minh được nữa.

Chỉ có mã Firefox và IE là một phần của đoạn mã gốc.

Việc kiểm tra Opera, Edge và Chrome rất đơn giản. Họ có sự khác biệt trong userAgent. OPRchỉ tồn tại trong Opera. Edgechỉ tồn tại trong Edge. Vì vậy, để kiểm tra Chrome, chuỗi này không nên có.

Đối với Firefox và IE, tôi không thể giải thích những gì họ làm.

Tôi sẽ thêm chức năng này vào một gói tôi đang viết


-4

tất cả các câu trả lời đều sai. "Opera" và "Chrome" giống nhau trong mọi trường hợp.

(phần chỉnh sửa)

đây là câu trả lời đúng

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

1
Nhận xét tốt hơn một câu trả lời.
Bông Jace

Trong trường hợp bạn đang tự hỏi tại sao bạn bị mod, điều này không đúng. Đối với một ví dụ, họ xử lý các phím tắt và bộ điều chỉnh khóa truy cập khác nhau (và chúng cũng không thể được phát hiện tính năng).
Zilk

Tôi không nói rằng 'opera' và 'chrome' là cùng một biểu tượng trình duyệt là khác nhau. Tôi nói rằng các phương pháp được mô tả ở trên đang cho kết quả giống nhau cho cả hai trình duyệt.
MediaWiki Harutyunyan

@Zilk Bạn đã thử ví dụ câu trả lời đầu tiên có 66 phiếu bầu chưa?
MediaWiki Harutyunyan

9
Điều này sẽ không còn hoạt động như của chrome 71. window.chrome.webstorebây giờundefined
Esteban
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.