JavaScript: Як дізнатися, чи є браузер користувача Chrome?


220

Мені потрібна деяка функція, що повертає булеве значення, щоб перевірити, чи браузер Chrome .

Як створити таку функціональність?


16
Ви впевнені, що замість цього не хочете займатися виявленням функцій (замість того, щоб запитувати "це Chrome?" Запитати "чи можна це зробити, що мені потрібно?")
bdukes

42
хто знає? він може захотіти, щоб користувач завантажив хромоване розширення
naveen

2
Це питання ілюструє проблему виявлення агента користувача. Лише через три роки фон 3D 3D Box (спробує) завантажити в Chrome свій мобільний телефон низького класу, але навіть не спробує Firefox на моєму настільному комп’ютері високого класу.
Альваро Гонсалес

5
Я погоджуюся з тим, що виявити функції - це шлях. але є законні області, де ви хочете виявити. напр., я хочу поправити мавпу xhr.sendAsBinary лише для хромування. моє початкове рішення перевірено, чи filereader.readasbinary реалізований. Однак у мене виникають проблеми, де він також виправляє певні веб-переглядачі для мобільних пристроїв, тому завантаження не вдається. Я хочу це виправлення лише для хрому.
frostymarvelous

4
Хочете дізнатися, чому може бути доречно знати, чи є браузер Chrome? Як щодо Chrome не може завантажити RSS-канали? Так що замість посилання на RSS-канал, який не вдасться завантажити в Chrome, ви могли насправді надати попередження або перенаправити користувача? Ні, завдяки вам Google Chrome ...
Pic Mickael

Відповіді:


205

Оновлення: див . Відповідь Джонатана щодо оновленого способу вирішення цього питання. Відповідь нижче може все-таки спрацювати, але це, ймовірно, може викликати помилкові позитиви в інших браузерах.

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

Однак, як зазначені Агенти користувача, можна підробляти підробку, тому для обробки цих проблем завжди найкраще використовувати виявлення функцій (наприклад, Modernizer ), як згадуються в інших відповідях.


які міркування щодо використання .toLowerCase - чому б не просто navigator.userAgent.indexOf ("Chrome") Я бачу, що багато людей використовують його, але я не впевнений у цьому?
Джон

7
@Serg, оскільки вони не мають Chrome. Це лише шкіра навколо iOS Safari.
Поетро

2
Дякую, хоч ваше ім'я має бути camelCase
Димитрій Копріва,

5
Оскільки багато браузерів повертає справжню версію на це, ось код, який я використовував, виключав Edge, Maxthon, iOS safari ... тощо var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.

2
Opera (принаймні версія 42) повертається Google Incдо navigator.vendor, тому цей метод не є бронезахисним, щось подібне /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent), мабуть, буде краще
yorch

314

Щоб перевірити, чи переглядає Google Chrome , спробуйте:

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

Приклад використання: http://codepen.io/jonathan/pen/WpQELR

Причина цього працює в тому, що якщо ви користуєтеся інспектором Google Chrome і переходите на вкладку консолі. Введіть "вікно" і натисніть клавішу Enter. Тоді ви зможете переглянути властивості DOM для 'об’єкта вікна'. Коли ви згортаєте об'єкт, ви можете переглянути всі властивості, включаючи властивість 'chrome'.

Ви більше не можете використовувати строго рівне істинне для реєстрації в IE window.chrome. IE раніше повертався undefined, тепер він повертається true. Але вгадайте що, IE11 тепер знову повертається невизначеним. IE11 також повертає порожній рядок ""для window.navigator.vendor.

Я сподіваюся, що це допомагає!

ОНОВЛЕННЯ:

Дякую Halcyon991 за те, що вказав нижче, що нова Opera 18+ також надає true для window.chrome. Схоже, що Opera 18 заснована на Chromium 31 . Тому я додав чек, щоб переконатися, що window.navigator.vendorце: "Google Inc"а не є "Opera Software ASA". Також дякую Ring і Adrien Be за те, що Chrome 33 більше не повертається істиною ... window.chromeтепер перевіряє, якщо не нуль. Але пильнуйте увагу до IE11, я додав перевірку назад, undefinedоскільки IE11 тепер виводить undefined, як це робилося при першому випуску .. потім після деяких оновлень будується, він виводиться на true.. тепер недавня збірка оновлення виводиться undefinedзнову. Microsoft не може вирішити це!

ОНОВЛЕННЯ 24.07.2015 - додаток для перевірки Opera

Щойно була випущена Opera 30. Він більше не виводить window.opera. А також window.chromeвиводить true у новій Opera 30. Тому ви повинні перевірити, чи OPR є у userAgent . Я оновив вище свій стан, щоб враховувати цю нову зміну в Opera 30, оскільки вона використовує той же механізм візуалізації, як і Google Chrome.

ОНОВЛЕННЯ 13.10.2015 - додаток для перевірки IE

Додано перевірку на IE Edge завдяки його виводу trueдля window.chrome.., хоча IE11 виходи undefinedдля window.chrome. Дякуємо artfulhacker за те, що повідомили нам про це!

ОНОВЛЕННЯ 2/5/2016 - додаток для перевірки iOS Chrome

Додано чек на iOS Chrome CriOSза допомогою виведення trueдля Chrome на iOS. Завдяки xinthose за те, що повідомили нам про це!

ОНОВЛЕННЯ 18.04.2018 - зміна для перевірки Opera

Відредагований чек на Opera, перевірка window.oprНЕ undefinedтак як тепер Chrome 66 має OPRв window.navigator.vendor. Дякуємо Frosty Z та Daniel Wallman за повідомлення про це!


Це не працює для IE10. typeof window.chrome в IE10 повертається {object}
magritte

2
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === "Google Inc.";
Кільце

1
Дякую @xinthose .. Я щойно додав чек на IOS Chrome .. дуже вдячний! :)
Джонатан Марзулло

2
Можливо така ж проблема, як і Деніел Уолман: мій агент користувача Android Chrome містить рядок "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, тому isChrome()повертає false .
Морозний Z

2
Дякую @FrostyZ та @DanielWallman за те, що повідомили нам. Я виправив це, щоб перевірка Opera window.oprне була undefined.
Джонатан Марзулло


16

Набагато простіше рішення - просто використовувати:

var isChrome = !!window.chrome;

!!Просто перетворює об'єкт в логічне значення. У веб-переглядачах undefined, які не входять у хром, ця властивість буде , що не є правдою.

Зауважте, це також повертає істину для версій Edge, які базуються на Chrome (спасибі @Carrm за вказівку на це).


5
Opera насправді повертається trueдо window.chrome. Ознайомтеся з conditionizr.com, який має куленепробивне виявлення + виправлення.
Halcyon991

7
Ну, Opera в основному Chrome , хоча
Карел Bílek

Я просто не розумію, чому два рази !! , ви можете безпосередньо використовувати, якщо (chrome) {}
Vishal Sharma

3
@vishalsharma, !!перетворює значення в trueабо false. typeof(window.chrome)дає "object", тоді як typeof(!!window.chrome)дає "boolean". Ваш зразок коду також працює, оскільки ifоператор робить перетворення.
Дрю Ноакс

1
Це також повертається trueза Edge.
Карм

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, '  '));


На жаль, navigator.vendor === "Google Inc." в Opera (принаймні v.49), тому використання коду Opera з'являється як Chrome.
Войтек Маєрський

9
Десь у світі кошеня помирає за кожну виразку, яка нам насправді не потрібна.
Sz.

Ніяких пояснень, жодних ознак помилкових позитивів / негативів, просто фрагмент коду, викинутого тут ... Цю відповідь справді слід оскаржити. Це навіть не відповідь на поставлене запитання.
Олександр Жермен

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

3
Мені це сподобалось, пам’ятайте, ви також можете робити var is_chrome = /chrome/i.test(navigator.userAgent); теж
АланФостер

14
Повертається trueв Microsoft Edge.
Коббі

@Cobby: При всій повазі Edge тоді не звільняли. Дякую за інформацію :)
naveen

3

Також вам може знадобитися конкретна версія Chrome:

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

Вибачте Великого Лебовського за те, що він використав свою відповідь у моїй.


4
Версія знаходиться "537.36"в Microsoft Edge.
Коббі

3

Ви можете використовувати:

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

Він працює на v.71


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

2

Підходить для мене на Chrome на Mac. Здається, є більш простим або надійним (у випадку тестування рядка userAgent), ніж усі вище.

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

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

1

Користувач може змінити агент користувача. Спробуйте протестувати webkitвластивість префікса в styleоб'єкті bodyелемента

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

1
У firefox: ("webkitAnimation" у document.body.style) === true
Томаш Прадо

3
FYI: "webkitAppearance" вже не працює. Зараз його використовує Edge. Можливо, найкраще видалити свою відповідь. ^^
hexalys


0

Знати імена різних настільних браузерів (Firefox, IE, Opera, Edge, Chrome). За винятком Сафарі.

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

Працює в наступних версіях браузера:

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)

Подивіться суть тут і загадку тут

Оригінальний фрагмент коду більше не працював для Chrome, і я забув, де його знайшов. Раніше в ньому було сафарі, але я більше не маю доступу до сафарі, тому більше не можу перевірити.

Лише коди Firefox та IE були частиною оригінального фрагмента.

Перевірка Opera, Edge та Chrome прямо зараз. Вони мають відмінності в userAgent. OPRіснує лише в Opera. Edgeіснує лише в Edge. Тож для перевірки на Chrome ці рядки не повинні бути.

Що стосується Firefox та IE, я не можу пояснити, що вони роблять.

Я додаю цю функціональність до пакета, який я пишу


-4

всі відповіді неправильні. "Opera" та "Chrome" однакові у всіх випадках.

(відредагована частина)

ось правильна відповідь

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

1
Кращий коментар, ніж відповідь.
Джейс Коттон

Якщо вам цікаво, чому вас відмовили, це просто не так. Наприклад, вони по-різному обробляють комбінації клавіш та змінюють модифікатори клавіш (і їх також не можна виявити).
Зільк

Я не кажу, що "опера" і "хром" - це один і той же браузер, лише піктограма відрізняється. Я кажу, що описані вище методи дають однаковий результат для обох браузерів.
Арарат Арутюнян

@ Zilk Ви перевірили, наприклад, першу відповідь, яка має 66 голосів?
Арарат Арутюнян

9
Це більше не буде працювати з хромом 71. window.chrome.webstoreЗаразundefined
Естебан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.