JavaScript: как узнать, является ли пользовательский браузер Chrome?

Мне нужна функция, возвращающая логическое значение, чтобы проверить, является ли браузер Chrome.

Как мне создать такой функционал?


person Rella    schedule 30.12.2010    source источник
comment
Вы уверены, что не хотите вместо этого выполнять обнаружение функций (вместо того, чтобы спрашивать, это Chrome? Спросите, может ли это сделать то, что мне нужно?)   -  person bdukes    schedule 30.12.2010
comment
Аминь, обнаружение конкретных браузеров - это именно то, как мы получили проблему с сайтами, отказывающимися работать с любым другим браузером, кроме IE и Netscape, даже когда другие браузеры вполне способны правильно их отображать. Обнаружение возможностей - это более безопасный и перспективный путь вперед.   -  person kander    schedule 30.12.2010
comment
кто знает? он может захотеть, чтобы пользователь загрузил расширение для Chrome   -  person naveen    schedule 30.12.2010
comment
Нет, я хочу использовать three.js просто для создания забавного фона 3D-бокса =), который быстро работает только в хроме ... =)   -  person Rella    schedule 30.12.2010
comment
Этот вопрос иллюстрирует проблему обнаружения пользовательского агента. Всего через три года Fun 3D Box Background (попытается) загрузить в Chrome мой мобильный телефон низкого уровня, но даже не будет пытаться использовать Firefox на моем настольном компьютере высокого класса.   -  person Álvaro González    schedule 05.12.2013
comment
@ ÁlvaroG.Vicario, согласен. Приведенный вариант использования не очень хорош. У меня есть ситуация, когда мы разработали приложение, подтверждающее концепцию, и точно знаем, что оно правильно отображается только в Chrome, но мы отправим ссылку кучке нетехнических руководителей. Поэтому для тех, кто щелкает ссылку и открывает ее в IE / Firefox / Opera, мы показываем примечание, объясняющее, что это просто POC, и мы сделаем так, чтобы он поддерживал их браузер в будущем. Я думаю, что это допустимый вариант использования.   -  person Drew Noakes    schedule 05.12.2013
comment
Я согласен, что обнаружение функций - это лучший способ. но есть законные области, которые вы хотели бы обнаружить. например Я хочу патч обезьяны xhr.sendAsBinary только для хрома. мое первоначальное решение проверило, реализован ли filereader.readasbinary. однако у меня возникают проблемы, когда он также исправляет некоторые мобильные браузеры, и поэтому загрузка не выполняется. Я хочу это исправить только для хрома.   -  person frostymarvelous    schedule 15.12.2013
comment
Другой пример, когда определение функции не сработает: я хочу определить, позволяет ли ввод имени сайта и TAB TAB использовать локальный поиск по сайту, поэтому я могу добавить подсказку. Это невозможно сделать с помощью функции обнаружения.   -  person user239558    schedule 17.03.2014
comment
Хотите знать, почему важно знать, является ли браузер Chrome? Как насчет того, что Chrome не может загружать RSS-каналы? Чтобы вместо ссылки на RSS-канал, который не загружается в Chrome, вы могли выдать предупреждение или перенаправить пользователя? Нет, спасибо тебе, Google Chrome ...   -  person Pic Mickael    schedule 06.04.2015
comment
Для тех, кто проповедует обнаружение функций ... да, в целом понимают, что это предпочтительнее, но есть много случаев, когда это нежизнеспособно, поэтому вопрос имеет смысл. Например, полифиллинг неполных / неправильных реализаций такой функции, как IndexedDB в IE / Edge.   -  person Hans    schedule 16.02.2017
comment
Как и @PicMickael, я также ищу альтернативную информацию для RSS-канала для пользователя, поскольку Chrome не предоставляет никаких встроенных возможностей RSS.   -  person eidylon    schedule 27.11.2018
comment
Бывают странные ситуации, когда в браузере Google Chrome есть конкретная ошибка / несоответствие, которых нет в других браузерах. У меня было это несколько раз за последние пять лет или около того ...   -  person Miloš Đakonović    schedule 27.09.2019
comment
Я хотел бы еще раз задать этот вопрос - есть ли на него надежный и простой ответ? Есть много подобных вопросов по SO, и все же большинство из них работают за счет функции userAgent, что даже w3schools признает неточным. Я проверил некоторые ответы на этот и аналогичные вопросы, и ни один из них не является надежным даже на 50%. Если мне лучше задать новый вопрос, дайте мне знать.   -  person 5Diraptor    schedule 17.03.2021
comment
@ 5Diraptor - если вы посмотрите на ответ Джонатана, который рекомендует вам сделать главный ответ Риона, вы увидите историю ОБНОВЛЕНИЙ ревизий - эта история говорит вам, что нет, на этот вопрос нет надежного и простого ответа и, вероятно, никогда будет. Если вам абсолютно необходимо определить какой браузер, вместо использования функции обнаружения, вам потребуется обслуживание, чтобы не отставать от изменений.   -  person Stephen P    schedule 08.04.2021


Ответы (19)


Обновление: см. ответ Джонатана, чтобы узнать об обновленном способе решения этой проблемы. Приведенный ниже ответ может по-прежнему работать, но он может вызвать ложные срабатывания в других браузерах.

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

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

person Rion Williams    schedule 30.12.2010
comment
в чем причина использования .toLowerCase - почему не просто navigator.userAgent.indexOf ('Chrome') Я вижу, что многие люди используют его, но я не уверен в сути? - person Jon; 30.01.2013
comment
добавление .toLowerCase просто гарантирует, что строка будет переведена в нижний регистр, поэтому, когда строка в условии проверяется, она оценивается правильно при проверке с помощью пользовательского агента - person Jonathan Marzullo; 25.02.2013
comment
@Serg, потому что у них нет Chrome. Это всего лишь оболочка вокруг iOS Safari. - person Poetro; 05.12.2013
comment
Странно, иногда я исправлял ошибки только для хромированной версии ios safari. - person Serg; 08.12.2013
comment
Просто примечание - IE9 имеет chromeframe в пользовательском агенте. - person Karel Bílek; 06.03.2014
comment
если браузер Maxthon, он также вернет true, поэтому сначала проверьте, не является ли браузер maxthon, а затем проверьте, является ли он хромом - person Marwan; 27.01.2015
comment
Спасибо, хотя ваше имя var должно быть camelCase - person Dimitri Kopriwa; 28.01.2015
comment
Обнаружение функций отличное, за исключением разработки расширений для сайтов, которые возвращают для Chrome совершенно другие представления, чем в любом другом браузере. Что-то, с чем обнаружение функции не помогает. - person Craig Brett; 22.02.2015
comment
больше не используйте предложение @JonathanMarzullo, в 2015 году в каждом браузере есть набор window.chrome :-( - person artfulhacker; 13.10.2015
comment
@artfulhacker .. IE будет выводить undefined для windows.chrome .. если вы хотя бы потрудитесь взглянуть на мой полный ответ ниже, вы увидите, что я учитываю это на основе имени поставщика, попробуйте сначала посмотреть условие в моем заявлении, прежде чем приставать к чьему-то ответу: ) - person Jonathan Marzullo; 13.10.2015
comment
@artfulhacker Stack Overflow - это не сообщество для приставания к людям. IE11 выводит window.chrome как undefined .. так что я добавлю проверку для IE Edge, спасибо .. По крайней мере, проявите некоторую общую любезность, как и все остальные, и оставьте полезный комментарий вместо того, чтобы быть грубым :) - person Jonathan Marzullo; 13.10.2015
comment
@artfulhacker Мой комментарий выше был написан в 2012 году, когда IE Edge еще не существовало. Пожалуйста, смотрите мой полный ответ ниже. Каждый раз, когда я получаю уведомление или узнаю, что современный браузер изменился, я обновляю свой ответ ниже! Но спасибо, что сообщили мне об IE Edge. Вывод true для window.chrome :) - person Jonathan Marzullo; 13.10.2015
comment
@JonathanMarzullo, пожалуйста, я даже проголосовал за ответ :-) Возможно, пора удалить комментарий, так как он не может быть обновлен. - person artfulhacker; 13.10.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person artfulhacker; 13.10.2015
comment
Возвращает true в Microsoft Edge. - person Cobby; 01.02.2016
comment
Поскольку многие браузеры при этом возвращают истину, вот код, который я использовал, исключая Edge, Maxthon, iOS safari ... и т. Д. var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1)); - person Alex C.; 01.03.2016
comment
Opera (по крайней мере, версия 42) возвращает Google Inc в navigator.vendor, поэтому этот метод не является пуленепробиваемым, что-то вроде /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent), вероятно, будет работать лучше - person yorch; 17.01.2017
comment
позаботьтесь о том, чтобы первая часть проверки вернула false на ios chrome - person strix25; 27.04.2021

Чтобы проверить, является ли браузер 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 и переходите на вкладку консоли. Введите "окно" и нажмите клавишу ВВОД. После этого вы сможете просмотреть свойства DOM для «объекта окна». Когда вы сворачиваете объект, вы можете просматривать все его свойства, включая свойство chrome.

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

Надеюсь, это поможет!

ОБНОВЛЕНИЕ:

Спасибо Halcyon991 за указание ниже, что новая Opera 18+ также выдает значение true для window.chrome. Похоже, Opera 18 основана на Chromium 31. Поэтому я добавил проверку, чтобы убедиться, что window.navigator.vendor равен: "Google Inc", а не "Opera Software ASA". Также спасибо Ring и Адриен Бе, чтобы предупредить о том, что 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 за то, что сообщили нам об этом!

ОБНОВЛЕНИЕ 05.02.2016 - дополнение для iOS Chrome check

Добавлена ​​проверка для iOS Chrome check CriOS, так как она выводит true для Chrome на iOS. Спасибо xinthose за то, что сообщили нам об этом!

ОБНОВЛЕНИЕ 18.04.2018 - изменение для проверки Opera

Отредактированная проверка для Opera, проверка window.opr не undefined, так как теперь Chrome 66 имеет OPR в window.navigator.vendor. Благодаря Frosty Z и Daniel Wallman за сообщение об этом!

person Community    schedule 12.11.2012
comment
Это не работает для IE10. typeof window.chrome в IE10 возвращает {объект} - person magritte; 30.05.2013
comment
это не будет работать в ie10, потому что ie10 не имеет window.chrome ... так что это вернет false в ie10. - person Jonathan Marzullo; 31.05.2013
comment
если НЕ хром, он также вернет undefined или false - person Jonathan Marzullo; 20.07.2013
comment
window.chrome не вернул {объект} на моем компьютере. Я думаю, было бы ОЧЕНЬ странно, если бы window.chrome существовал в объекте окна. Пока я считаю, что это правильный ответ. - person Arnaldo Capo; 25.11.2013
comment
^ Существует в браузере IE, я имел в виду. - person Arnaldo Capo; 26.11.2013
comment
Стоит отметить, что Opera теперь отвечает true на window.chrome! Посетите conditionizr.com, на котором есть пуленепробиваемое обнаружение + исправление. - person Stephen Jenkins; 04.12.2013
comment
@ Halcyon991 Спасибо за внимание! Похоже, Opera 18 теперь основана на Chromium. Я добавил условие, чтобы также проверить, является ли браузер Google (Chrome) или Opera (Chrome), еще раз спасибо - person Jonathan Marzullo; 04.12.2013
comment
var isGoogleChrome = window.chrome! = null && window.navigator.vendor === Google Inc .; - person Ring; 22.01.2014
comment
@ Mr.Bacciagalupe: мне пришлось использовать обновленный ответ Ring, чтобы эта работа if(isChromium === true) не работает в Chrome версии 33. - person Adrien Be; 27.03.2014
comment
@Ring: вы тестировали это решение в разных версиях браузера? Я мог тестировать только Chrome 33, IE11 и Firefox 27 (последние версии каждого на момент написания, конец марта 2014 г.) - person Adrien Be; 27.03.2014
comment
@Ring и @Adrien Be .. Спасибо .. IE11 теперь возвращает true для window.chrome ... IE11 также возвращает пустую строку для window.navigator.vendor. Так что если вы протестируете и window.chrome, и window.navigator.vendor, все будет в порядке. :) - person Jonathan Marzullo; 27.03.2014
comment
Запуск IE11, window.chrome возвращает undefined в консоли - person vogomatix; 13.08.2014
comment
@vogomatix Спасибо .. Я добавил проверку для undefined, так как IE11 теперь выводит undefined, как это было при первом выпуске .. затем после некоторых обновлений он выводится на true .. теперь последняя сборка обновлений снова выводит undefined .. о, глупый Microsoft :) - person Jonathan Marzullo; 14.08.2014
comment
Итак, у нас есть некоторые сборки IE11, которые не претендуют на роль хрома, а другие - прекрасно! :-) - person vogomatix; 15.08.2014
comment
@vogomatix .. если у вас включены автоматические обновления для IE и Windows 7 или 8, тогда все будет в порядке. На днях Microsoft соберется вместе ... или нет :) - person Jonathan Marzullo; 15.08.2014
comment
для последней версии Opera эта проверка не выполняется. По-прежнему получаю браузер Chrome. :( - person Martin Asenov; 23.07.2015
comment
Спасибо @Martin Asenov .. Я только что добавил дополнительную проверку к своему условию выше, чтобы проверить наличие новой Opera 30, потому что он использует тот же движок Google Chrome и выводит true в window.chrome. Вышеупомянутое теперь обнаруживает только Google Chrome :) - person Jonathan Marzullo; 24.07.2015
comment
это не работает для Chrome на iOS, потому что это сафари в хромированной оболочке, я думаю; - person xinthose; 05.02.2016
comment
Спасибо @xinthose .. Я только что добавил проверку для iOS Chrome ... очень признателен! :) - person Jonathan Marzullo; 05.02.2016
comment
@DanielWallman Какую версию Android вы используете? Я тестировал это на Android 6.1, и он сообщает (), что обнаруживает, что это Google Chrome ... для Desktop Chrome и Mobile Chrome. См. Пример: codepen.io/jonathan/pen/WpQELR - person Jonathan Marzullo; 28.02.2017
comment
Кстати, это обнаруживает хром, а также Google Chrome, FWIW ... - person rogerdpack; 14.03.2017
comment
@rogerdpack Спасибо, что уведомили меня :). Когда у меня будет время, мне придется добавить проверку для navigator.plugins[i].name == 'Chromium PDF Viewer', чтобы убедиться, что это Google Chrome, а не «хром», на основе этого ответа SO: stackoverflow.com/questions/17278770/ - person Jonathan Marzullo; 14.03.2017
comment
Может быть, та же проблема, что и у Дэниела Валлмана: мой пользовательский агент 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. - person Frosty Z; 18.04.2018
comment
Спасибо @FrostyZ и @DanielWallman за то, что сообщили нам об этом. Я исправил это, поэтому Opera проверяет window.opr не undefined. - person Jonathan Marzullo; 18.04.2018
comment
хм, у меня на телефоне Android 7 стоит Opera 50 (Chromium 71). Он возвращает undefined для window.chrome и window.opr. Есть идеи, почему? - person j.j.; 24.02.2019
comment
Когда я консоль window.chrome или window.opr на настольной Opera 58, он выводит эти объекты, так что они существуют, но также сразу после этих объектов выводит undefined. Не уверен, почему? Вы можете сообщить об ошибке и спросить разработчиков Opera, почему это так? bugs.opera.com/wizard - person Jonathan Marzullo; 25.02.2019
comment
Обратите внимание, что для TypeScript вам нужно будет сделать const isChromium = (window as any).chrome; и аналогичные действия для проверки Opera. - person Garrett; 08.09.2019
comment
Это ложное срабатывание для браузера Samsung ... Вот строка UserAgent: Mozilla / 5.0 (Linux; Android 5.0.1; SAMSUNG GT-I9500 Build / LRX22C) AppleWebKit / 537.36 (KHTML, как Gecko) SamsungBrowser / 2.1 Chrome / 34.0. 1847.76 Mobile Safari / 537.36 - person yestema; 09.12.2019
comment
Последнее значение пользовательского агента Edge на самом деле Edg, а не Edge (см. Также эти документы: docs.microsoft.com/en-us/microsoft-edge/web-platform/). Так что, возможно, эту строку: inNav.userAgent.indexOf("Edge") следует изменить на inNav.userAgent.indexOf("Edg"). - person Wilt; 03.12.2020

Если вы хотите обнаружить механизм рендеринга Chrome (а не определенные функции в Google Chrome или Chromium), простой вариант:

var isChrome = !!window.chrome;

ПРИМЕЧАНИЕ: это также возвращает true для многих версий Edge, Opera и т. д., основанных на Chrome (спасибо @Carrm за указание на это). Чтобы избежать этой постоянной битвы (см. window.opr ниже), вы следует спросить себя, пытаетесь ли вы обнаружить механизм рендеринга (используемый почти всеми основными современными браузерами в 2020 году) или какую-либо другую специфичную для Chrome (или Chromium?) функцию.

И вы, вероятно, можете пропустить !!

person Drew Noakes    schedule 05.12.2013
comment
Opera фактически возвращает true в window.chrome. Посетите conditionizr.com, на котором есть пуленепробиваемое обнаружение + исправление. - person Stephen Jenkins; 07.12.2013
comment
Ну, Opera - это в основном Chrome, хотя - person Karel Bílek; 06.03.2014
comment
Я просто не понимаю, почему два раза !! , вы можете напрямую использовать if (chrome) {} - person Vishal Sharma; 06.08.2014
comment
@vishalsharma, !! преобразует значение в true или false. typeof(window.chrome) дает "object", тогда как typeof(!!window.chrome) дает "boolean". Ваш пример кода также работает, потому что оператор if выполняет преобразование. - person Drew Noakes; 07.08.2014
comment
да, я пытаюсь сказать, если позаботится о преобразовании .. да, но вы тоже правы, для назначения мы должны использовать этот способ .. - person Vishal Sharma; 07.08.2014
comment
На сегодняшний день это не работает с Chrome 31 (последней версией) на iOS 7, iPhone 4. - person AnthumChris; 24.03.2015
comment
@Chris он не работает на iOS, потому что Blink нельзя использовать, здесь используется WebKit, поэтому ему нужно будет вернуться к агент пользователя. Однако вы, вероятно, не захотите рассматривать этот Google Chrome с точки зрения поддержки, поскольку это WebKit, а не Blink. - person Daniel Imms; 19.11.2015
comment
Это также возвращает true для Edge. - person Carrm; 11.09.2019
comment
Для меня это возвращается в IE. IE продолжает возвращать точно так же, как Chrome всех переменных userAgent и Navigator. - person Sam; 13.05.2020
comment
@ Sam, ты говоришь об IE или Edge? Edge основан на Chrome, который возвращает true для этого свойства. - person Drew Noakes; 13.05.2020

еще короче: var is_chrome = /chrome/i.test( navigator.userAgent );

person The Big Lebowski    schedule 09.05.2012
comment
Вернуть true в Microsoft Edge. - person Cobby; 01.02.2016

Вы можете использовать:

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

Работает на v.71

person magg89    schedule 07.12.2018
comment
Имейте в виду, что это вернется в Edge Chromium, а также в Google Chrome. Для моего случая использования это было положительно, но OP может быть нацелен только на Google Chrome. - person Jeff Mergler; 09.03.2021

Если вы чувствуете себя смелым, вы можете поэкспериментировать с обнюхиванием браузера и получить версию:

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

Эта обнаруженная версия может быть версией Chrome, версией Edge или чем-то еще. Плагины браузера могут легко изменить userAgent, платформу и другие вещи, поэтому делать это не рекомендуется.

Приношу свои извинения Большому Лебовски за то, что использовал его ответ в моем.

person MrOodles    schedule 07.08.2012
comment
Версия "537.36" в Microsoft Edge. - person Cobby; 01.02.2016

Начиная с Chrome 89 (март 2021 г.), все предыдущие ответы устарели. Chrome теперь поддерживает подсказки для агента пользователя. Итак, теперь это нужно сделать, используя:

navigator.userAgentData?.brands?.some(b => b.brand === 'Google Chrome')

Или, если вы не используете Babel:

navigator.userAgentData && navigator.userAgentData.brands && navigator.userAgentData.brands.some(b => b.brand === 'Google Chrome')

Это возвращает true для Chrome 89 и выше, false для последних версий Opera и Edge и undefined для браузеров, которые не поддерживают userAgentData.

person Jay Dunning    schedule 09.05.2021

Чтобы проверить, является ли браузер Google Chrome:

var isChrome = navigator.userAgent.includes("Chrome") && navigator.vendor.includes("Google Inc");

console.log(navigator.vendor);
// "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 "

console.log(navigator.userAgent); 
// "Google Inc."
person Haikel    schedule 21.10.2020

Есть несколько дополнительных свойств окна, которые можно использовать при обнаружении браузера. Одно из них - необязательное свойство chrome (Chromium), а другое - необязательное свойство opr (Opera).

Если в браузере есть необязательное свойство chrome для объекта Window, это означает, что браузер является браузером Chromium. Раньше в большинстве случаев это означало Chrome, но в наши дни многие браузеры построены на Chromium (включая Edge и Opera), поэтому только проверка наличия свойства не поможет конкретно обнаружить браузеры Chrome.

Затем часто бывает несколько пользовательских агентов для разных версий браузеров (Edg или Edge) или операционных систем (EdgiOS, ChriOS и FxiOS).

Я использую следующую логику и тестировал множество случаев (обычные пользовательские агенты):

const GOOGLE_VENDOR_NAME = 'Google Inc.';

function isOpera(){
  return Boolean(window.opr);
}

function isChromium() {
  return Boolean(window.chrome);
}

function getBrowserName() {
  const userAgent = window.navigator.userAgent;
  const vendor = window.navigator.vendor;
  switch (true) {
    case /Edge|Edg|EdgiOS/.test(userAgent):
      return 'Edge';
    case /OPR|Opera/.test(userAgent) && isOpera():
      return 'Opera';
    case /CriOS/.test(userAgent):
    case /Chrome/.test(userAgent) && vendor === GOOGLE_VENDOR_NAME && isChromium():
      return 'Chrome';
    case /Vivaldi/.test(userAgent):
      return 'Vivaldi';
    case /YaBrowser/.test(userAgent):
      return 'Yandex';
    case /Firefox|FxiOS/.test(userAgent):
      return 'Firefox';
    case /Safari/.test(userAgent):
      return 'Safari';
    case /MSIE|Trident/.test(userAgent):
      return 'Internet Explorer';
    default:
      return 'Unknown';
  }
}

function isChrome() {
  const name = getBrowserName();
  return name === 'Chrome';
}

Вы можете найти этот упрощенный код в этой скрипке:

Хитрость заключается в том, чтобы сначала протестировать другие браузеры, а не Chrome (Edge, Opera). Во всех этих случаях в переключателе различные возможные идентификаторы браузера объединяются в одно регулярное выражение и проверяются на соответствие строке пользовательского агента. Для Chrome и Opera добавлены дополнительные тесты для свойства окна, а для Chrome мы также проверяем, соответствует ли имя поставщика ожидаемому значению.


Примечание. Я тестировал множество различных пользовательских агентов, но не буду здесь утверждать, что это решение безупречно. Мы приветствуем любые предложения по улучшению или обнаружение сбоев в браузере, чтобы я мог улучшить этот код.


ОБНОВИТЬ:

Исправлена ​​ошибка с обнаружением Chrome на iOS (пользовательский агент CriOS). Chrome на iOS не имеет свойства chrome: true в объекте окна, поэтому его следует проверять только на наличие строки пользовательского агента.

person Wilt    schedule 08.04.2021
comment
Спасибо, это работает! - person Max Bunker; 15.04.2021

По состоянию на июнь 2021 года это обнаруживает Chrome. Но через неделю, месяц, год в какой-то момент перестанет работать, но основной принцип останется. Сначала проверьте браузер userAgent, а затем проверьте функцию, которая уникальна только для этого браузера.

Вот сценарий, который определяет между Chrome и Brave и Opera. Все используют один и тот же движок, но так уж получилось, что объект window.navigator.plugins.length имеет разную длину по умолчанию для каждого браузера.

Я не вижу никакого смысла в обнаружении браузера, если только он не предназначен для цифрового отпечатка пальца (или не знает, как этого избежать), а при разработке для Интернета это должны быть функции, которые мы обнаруживаем, а не дискриминируем пользователя при выборе любой конкретный браузер. Верно?

Чтобы подделать userAgent, вы можете использовать любую надстройку или расширение, но это не убережет вас от обнаружения функций. Например, в этом примере я мог бы определить window.navigator.plugins.length как 4 и предсказать, что вы, вероятно, используете Brave, даже если ваш userAgent говорит мне иное.

Причина для обнаружения userAgent в первую очередь заключается в том, что это означает, что человек НЕ занимается спуфингом, и, следовательно, можно определить, кто на самом деле спуфинг, что также может быть использовано для снятия отпечатков пальцев.

// Check between Brave, Chome and Opera
window.onload = function detectBraveBrowser() {
  try {
    console.log(navigator.userAgent);
    // First match Chrome uerAgent, since Brave userAgent is identical
    if (navigator.userAgent.match(/chrome/i)) {
      // Next check feature, Chrome value is 2, Opera 3, Brave 4
      if (window.navigator.plugins.length === 4) {
        document.getElementById('detection').textContent = 'Brave ';
      }
      else if (window.navigator.plugins.length === 3) {
        document.getElementById('detection').textContent = 'Opera ';
      }
      else if (window.navigator.plugins.length === 2) {
        document.getElementById('detection').textContent = 'Chrome ';
      }
    } else {
      document.getElementById('detection').textContent = 'Unknown';
    }
  } catch (e) {
    // Statement to handle errors
     document.getElementById('detection').textContent = 'Error';
  }
};
<div id="detection"></div>

person itjustneverends    schedule 24.06.2021

Пользователь может изменить пользовательский агент. Попробуйте протестировать свойство с префиксом webkit в объекте style элемента body

if ("webkitAppearance" in document.body.style) {
  // do stuff
}
person guest271314    schedule 26.10.2015
comment
В firefox: (webkitAnimation в document.body.style) === true - person Tomas Prado; 27.04.2017
comment
К вашему сведению: «webkitAppearance» тоже больше не работает. Edge сейчас использует это. Наверное, лучше всего удалить свой ответ. ^^ - person hexalys; 29.04.2017

У меня работает в Chrome на Mac. Кажется, это или проще, или более надежно (в случае проверки строки userAgent), чем все вышеперечисленное.

        var isChrome = false;
        if (window.chrome && !window.opr){
            isChrome = true;
        }
        console.log(isChrome);
person yurin    schedule 28.02.2019
comment
Думаю, этот ответ отвергли любители одинарных лайнеров. Несмотря на то, что я понимаю вашу страсть, я не думаю, что вы должны голосовать против совершенно правильного ответа, основанного только на нем. - person yurin; 25.07.2020

Знать названия различных настольных браузеров (Firefox, IE, Opera, Edge, Chrome). Кроме 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;
}

Работает в следующих версиях браузеров:

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, я не могу объяснить, что они делают.

Я добавлю эту функцию в пакет, который я пишу

person Dev    schedule 06.03.2019

Лучшее решение, которое я нашел, и которое дает истинное или ложное значение в большинстве браузеров:

var isChrome = (navigator.userAgent.indexOf("Chrome") != -1 && navigator.vendor.indexOf("Google Inc") != -1)

Использование .indexOf вместо .includes делает его более совместимым с браузером. Даже если (или потому что) все дело в том, чтобы сделать ваш код специфичным для браузера, вам нужно, чтобы условие работало в большинстве (или во всех) браузерах.

person Gefilte Fish    schedule 19.04.2021
comment
То же решение, что и существующий ответ, полученный несколько лет назад. Как отмечено в этом ответе, для Edge Chromium возвращает true. - person Heretic Monkey; 19.04.2021
comment
@HereticMonkey Спасибо, что указали на это. Отредактировано - person Gefilte Fish; 19.04.2021

Проверьте это: Как определить Safari, Chrome, IE, Firefox и браузер Opera?

В твоем случае:

var isChrome = (window.chrome.webstore || window.chrome.runtime) && !!window.chrome;
person Community    schedule 08.01.2019
comment
Не работает в Chrome для Android ни в браузере, ни как PWA. Проверка консоли разработчика показывает, что window.chrome {loadTimes: ƒ, csi: ƒ} - person Simon B.; 05.10.2020

var is_chrome = browseris.chrome

или проверьте в других браузерах:

browseris.firefox
browseris.ie
browseris.safari

Кроме того, вы можете проверить версию, например browseris.chrome7up и т. д.

проверьте всю существующую информацию в объекте browseris

person WantToDo    schedule 27.10.2020

все ответы неверны. «Опера» и «Хром» во всех случаях одинаковы.

(отредактированная часть)

вот правильный ответ

if (window.chrome && window.chrome.webstore) {
    // this is Chrome
}
person Ararat Harutyunyan    schedule 07.05.2015
comment
Лучше комментарий, чем ответ. - person Jace Cotton; 26.05.2015
comment
Если вам интересно, почему вы отказались от мода, это просто неправда. Например, они по-разному обрабатывают сочетания клавиш и модификаторы клавиш доступа (и они также не могут быть обнаружены функцией). - person Zilk; 27.05.2015
comment
Я не говорю, что «опера» и «хром» - это один и тот же браузер, только значок отличается. Я говорю, что описанные выше методы дают одинаковый результат для обоих браузеров. - person Ararat Harutyunyan; 29.05.2015
comment
@Zilk Вы проверяли, например, первый ответ, за который проголосовало 66 человек? - person Ararat Harutyunyan; 29.05.2015
comment
Ваш отредактированный правильный ответ неверен; он вызовет ошибку ReferenceError в Firefox и других. Используйте либо typeof chrome, либо window.chrome. - person Zilk; 03.06.2015
comment
вы правы, можно использовать только window.chrome. - person Ararat Harutyunyan; 03.06.2015
comment
Это больше не будет работать, начиная с версии chrome 71. window.chrome.webstore теперь undefined - person Esteban; 05.12.2018

person    schedule
comment
К сожалению, navigator.vendor === Google Inc. в Opera (по крайней мере, v.49), поэтому при использовании вашего кода Opera отображается как Chrome. - person Wojtek Majerski; 04.12.2017
comment
Где-то в мире котенок умирает от каждого регулярного выражения, которое нам на самом деле не нужно. - person Sz.; 12.03.2018
comment
Никаких объяснений, никаких указаний на ложные срабатывания / отрицания, только кусок кода, сброшенный сюда ... Этот ответ действительно должен быть отвергнут. Это даже не ответ на заданный вопрос. - person Alexandre Germain; 26.05.2019
comment
К сожалению, navigator.vendor === "Google Inc." также на Edge (по крайней мере, v.89), поэтому при использовании вашего кода Edge также отображается как Chrome, а isEdge становится ложным (пользовательский агент для браузера Edge на основе Chromium - Edg). - person Wilt; 07.04.2021

person    schedule
comment
Мне это понравилось, помните, вы также можете сделать var is_chrome = /chrome/i.test(navigator.userAgent); тоже - person AlanFoster; 16.12.2011
comment
Возвращает true в Microsoft Edge. - person Cobby; 01.02.2016
comment
@Cobby: При всем уважении, Edge не был выпущен в то время. Спасибо за информацию :) - person naveen; 01.02.2016