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

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

如何创建此类功能?


答案 1

要检查浏览器是否为谷歌浏览器,请尝试以下操作:

// 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("Edg") > -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 
}

使用示例:https://codepen.io/jonathan/pen/RwQXZxJ?editors=1111

这有效的原因是,如果您使用Google Chrome检查器并转到控制台选项卡。键入“窗口”,然后按回车键。然后,您可以查看“窗口对象”的 DOM 属性。折叠对象时,可以查看所有属性,包括“chrome”属性。

您不能再使用严格等于 true 来签入 IE 中的 .IE曾经返回,现在它返回。但你猜怎么着,IE11现在再次返回未定义。IE11 还返回 的空字符串。window.chromeundefinedtrue""window.navigator.vendor

我希望这有帮助!

更新:

感谢 Halcyon991 在下面指出,新的 Opera 18+ 也输出为 true for 。看起来Opera 18是基于Chromium 31的。因此,我添加了一个检查,以确保 is: 而不是 .还要感谢RingAdrien Be对Chrome 33不再返回的真实提醒...... 现在检查是否为空。但是密切关注IE11,我添加了检查,因为IE11现在输出 ,就像首次发布时一样。然后在一些更新构建后,它输出到..现在,最近的更新版本将再次输出。微软无法下定决心!window.chromewindow.navigator.vendor"Google Inc""Opera Software ASA"window.chromeundefinedundefinedtrueundefined

2015 年 7 月 24 日更新 - Opera 检查新增功能

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

2015 年 10 月 13 日更新 - IE 检查新增功能

添加了对 IE Edge 的检查,因为它输出了 ..即使 IE11 输出为 .感谢artfulhacker让我们知道这一点!truewindow.chromeundefinedwindow.chrome

更新 2/5/2016 - iOS Chrome 检查的新增功能

添加了对iOS Chrome检查的检查,因为它在iOS上输出了Chrome。感谢 xinthose 让我们知道这一点!CriOStrue

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

编辑了Opera的检查,检查不是因为现在Chrome 66已经在.感谢Frosty ZDaniel Wallman报道此事!window.oprundefinedOPRwindow.navigator.vendor


答案 2

更新:请参阅乔纳森的答案,了解处理此问题的更新方法。下面的答案可能仍然有效,但它可能会在其他浏览器中触发一些误报。

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

但是,如前所述,用户代理可能是欺骗性的,因此在处理这些问题时,最好始终使用功能检测(例如现代化器),正如其他答案所提到的。