JavaScript:如何确定用户浏览器是否为Chrome?


220

我需要一些返回布尔值的函数来检查浏览器是否为Chrome

如何创建此类功能?


16
您确定不希望执行功能检测(而不是询问“这是Chrome吗?”询问“我需要这样做吗?”)
bdukes 2010年

42
谁知道?他可能想让用户下载chrome扩展程序
naveen 2010年

2
这个问题说明了用户代理检测的问题。仅仅三年后,“ Fun 3D Box Background”将(尝试)加载到我的低端手机的Chrome中,但甚至不会尝试在我的高端台式机的Firefox中加载。
阿尔瓦罗·冈萨雷斯

5
我同意功能检测是必经之路。但有些地方是您想检测的。例如,我只想为chrome修补xhr.sendAsBinary补丁。我最初的解决方案检查了是否已实现filereader.readasbinary。但是,我在为某些移动浏览器打补丁时遇到了问题,因此上传失败。我只希望此修复程序适用于chrome。
2013年

4
是否想知道为什么浏览器是Chrome可能与之相关?Chrome无法加载RSS提要如何?因此,您实际上可以提供警告或重定向用户,而不是链接到无法在Chrome中加载的RSS feed。不,谢谢您,谷歌浏览器...
Pic Mickael 2015年

Answers:


205

更新:请参阅乔纳森的答案以获取更新的方式来处理此问题。以下答案可能仍然有效,但是可能会在其他浏览器中引发误报。

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

但是,正如提到的那样,用户代理可以被欺骗,因此在处理这些问题时总是最好使用功能检测(例如Modernizer),如其他答案所述。


使用.toLowerCase的背后原因是什么-为什么不只是navigator.userAgent.indexOf('Chrome')我看到很多人都在使用它,但是我不确定这是什么意思?
2013年

7
@Serg,因为他们没有Chrome。它只是iOS Safari的外观。
Poetro 2013年

2
谢谢,尽管您的var名称应为camelCase
Dimitri Kopriwa 2015年

5
由于许多浏览器对此都返回true,所以这是我使用的代码,该代码排除了Edge,Maxthon,iOS Safari ... etc var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
Alex C.

2
歌剧(至少版本42)返回Google Incnavigator.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”属性。

您不能再使用true等于true来检查IE中的window.chrome。IE曾经返回undefined,现在返回true但是猜猜是什么,IE11现在再次返回undefined。IE11还返回一个空字符串""window.navigator.vendor

我希望这有帮助!

更新:

感谢Halcyon991在下面指出,新的Opera 18+也会将true输出为true window.chrome。看起来Opera 18是基于Chromium 31的。因此,我添加了一个检查以确保window.navigator.vendoris是,"Google Inc"而不是is "Opera Software ASA"。同时还要感谢RingAdrien Be提醒,Chrome 33不再返回true ... window.chrome现在检查是否不为null。但是请密切注意IE11,undefined因为IE11现在已经输出了undefined,所以我增加了检查,就像第一次发布时一样。然后经过一些更新版本将其输出到true..现在undefined再次输出最近的更新版本。微软无法下定决心!

更新 2015-添加Opera检查

Opera 30刚刚发布。它不再输出window.opera。并且window.chrome在新的Opera 30中也输出为true。因此,您必须检查OPR是否在userAgent中。我更新了上面的条件,以说明Opera 30中的这一新更改,因为它使用的渲染引擎与Google Chrome浏览器相同。

更新10/13/ 2015-IE检查的补充

增加了检查IE边缘,由于其输出truewindow.chrome..即使IE11输出undefinedwindow.chrome。感谢artfulhacker让我们知道这一点!

更新2/5/ 2016-iOS Chrome检查的补充

添加了针对iOS的Chrome浏览器检查支票,CriOS因为该支票输出true为iOS上的Chrome浏览器。感谢xinthose让我们知道这一点!

更新4/ 18/2018-Opera检查更改

编辑检查歌剧,检查window.opr是不是undefined因为现在的Chrome 66 OPRwindow.navigator.vendor。感谢Frosty ZDaniel Wallman的报道!


这不适用于IE10。IE10中的typeof window.chrome返回{object}
magritte 2013年

2
var isGoogleChrome = window.chrome!= null && window.navigator.vendor ===“ Google Inc.”;
2014年

1
谢谢@xinthose ..我刚刚添加了IOS Chrome的支票。:)
Jonathan Marzullo

2
可能与Daniel Wallman的问题相同:我的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
Frosty

2
谢谢@FrostyZ和@DanielWallman告诉我们。我已将其修复,因此Opera window.opr不会检查undefined
乔纳森·马祖罗


16

一个更简单的解决方案就是使用:

var isChrome = !!window.chrome;

!!刚刚转换的对象为布尔值。在非Chrome浏览器中,此属性为undefined,这是不正确的。

请注意,对于基于Chrome的Edge版本,这也会返回true(感谢@Carrm指出这一点)。


5
歌剧实际上返回truewindow.chrome。请查看有防弹检测和修复功能的conditionizr.com。
Halcyon991

7
好吧,Opera基本上是Chrome浏览器
KarelBílek2014年

我只是不明白为什么两次!,您可以直接使用,if(chrome){}
Vishal Sharma 2014年

3
@vishalsharma,!!将值转换为truefalsetypeof(window.chrome)"object",而typeof(!!window.chrome)"boolean"。您的代码示例也可以工作,因为该if语句可以进行转换。
Drew Noakes 2014年

1
这也将返回trueEdge。
卡尔姆

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。
Wojtek Majerski

9
在世界上的某个地方,一只小猫死于我们实际上不需要的每一个正则表达式。
Sz。

没有任何解释,没有关于误报/否定的提示,只是在此处转储了一段代码...此响应应该被拒绝。它甚至不是对所提问题的答案。
亚历山大·杰曼

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

3
我喜欢这个,记住您也可以做var is_chrome = /chrome/i.test(navigator.userAgent); 也是
AlanFoster 2011年

14
true在Microsoft Edge中返回。
Cobby

@Cobby:在所有应得的尊重下,Edge当时并未发布。感谢您的信息:)
naveen '16

3

您可能还需要特定版本的Chrome:

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

向The Big Lebowski致歉,因为他在我的内部使用了他的答案。


4
版本"537.36"在Microsoft Edge中。
Cobby

3

您可以使用:

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

正在处理v.71


navigator.userAgent.includes("Chrome")
AlexSzücs

2

在Mac上的Chrome上对我有效。似乎比以上所有或更简单或更可靠(如果测试了userAgent字符串)。

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

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

1

用户可以更改用户代理。尝试测试元素对象中的webkit前缀属性stylebody

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

1
在firefox中:(document.body.style中的“ webkitAnimation”)=== true
Tomas Prado

3
仅供参考:“ webkitAppearance”也不再起作用。Edge现在正在使用它。最好删除您的答案。^^
hexalys 17-4-29


0

了解不同桌面浏览器(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,我无法解释它们的作用。

我将这个功能添加到我正在编写程序包中


-4

所有答案都是错误的。在所有情况下,“ Opera”和“ Chrome”都是相同的。

(编辑部分)

这是正确的答案

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

1
比回答更好的评论。
杰斯·科顿

如果您想知道为什么要被改装,那根本就不对。例如,他们对键盘快捷键和访问键修饰符的处理方式不同(这些键也无法检测到)。
Zilk

我并不是说'opera'和'chrome'是同一个浏览器,只是图标有所不同。我说上述方法对于两种浏览器都给出相同的结果。
2015年

@Zilk例如,您是否测试过第一个具有66票的答案?
Ararat Harutyunyan 2015年

9
从chrome 71开始将不再起作用。window.chrome.webstore现在undefined
Esteban '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.