要检查浏览器是否为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("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检查器并转到控制台选项卡,则可以输入“window”并按Enter键。然后,您就能够查看“window对象”的DOM属性。当您折叠该对象时,您可以查看所有属性,包括“chrome”属性。
您不能再使用严格相等来检查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和Adrien Be提醒Chrome 33不再返回true...现在window.chrome
检查是否为非空。但要特别注意IE11,我重新添加了对undefined
的检查,因为IE11现在输出undefined
,就像它首次发布时一样...然后在一些更新版本之后,它输出true
..现在最近的更新版本又输出undefined
了。微软无法下定决心!
更新7/24/2015-添加了Opera的检查
Opera 30刚刚发布。它不再输出window.opera
。并且在新的Opera 30中,window.chrome
也会输出为true。因此,您必须检查OPR是否在userAgent中。由于它使用与Google Chrome相同的渲染引擎,所以我更新了上面的条件,以适应Opera 30的这种新变化。
更新10/13/2015 - IE检查补充
添加了IE Edge的检查,因为它输出true
,即使IE11对window.chrome
的输出是undefined
。感谢artfulhacker让我们知道这个!
更新2/5/2016 - iOS Chrome检查补充
添加了对iOS Chrome检查CriOS
的检查,因为它在iOS上输出为Chrome的true
。感谢xinthose让我们知道这个!
更新 2018年4月18日 - Opera检查更改
编辑了对Opera的检查,检查window.opr
不是undefined
,因为现在Chrome 66在window.navigator.vendor
中有OPR
。感谢Frosty Z和Daniel Wallman的报告!
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。 - Maxime Pacarywindow.opr
是否未定义。 - Jonathan MarzulloEdg
而不是 Edge
(请参见这些文档:https://learn.microsoft.com/en-us/microsoft-edge/web-platform/user-agent-string)。因此,也许这一行:`inNav.userAgent.indexOf("Edge")` 应该改为 inNav.userAgent.indexOf("Edg")
。 - Wilt更新:请参阅Jonathan的答案,以获得一种更新的处理方式。下面的答案可能仍然有效,但在其他浏览器中可能会触发一些误报。
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
然而,正如所提到的,用户代理可以被伪造,因此在处理这些问题时,最好始终使用功能检测(例如Modernizer),正如其他答案所提到的。
true
。 - Cobbyvar is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) &&(navigator.vendor.toLowerCase().indexOf("google") > -1));
- Alex C.Google Inc
返回到navigator.vendor
,因此该方法并不是百分之百可靠的,类似于/Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent)
的方法可能会更好地工作。 - yorch如果你想检测Chrome的渲染引擎(而不是Google Chrome或Chromium中的特定功能),一个简单的选项是:
var isChrome = !!window.chrome;
注意:这也会返回对于基于Chrome的Edge、Opera等许多浏览器版本(感谢@Carrm指出)。避免这种情况是一场持续的战斗(请参见下文中的window.opr
),因此您应该思考是否要检测渲染引擎(几乎所有2020年主要现代浏览器都使用)还是其他Chrome(或Chromium?)专用功能。
而且,您可能可以跳过!!
window.chrome
返回为true
。请查看conditionizr.com,该网站具有可靠的检测和修复功能。 - Stephen Jenkins更简短的代码:var is_chrome = /chrome/i.test(navigator.userAgent);
true
。 - Cobbytrue
。 - Gagikconsole.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。”
,因此使用您的代码时,Edge也会显示为Chrome,并且isEdge
将变为false(基于Chromium的Edge浏览器的用户代理是“ Edg”)。 - Wilt截至2021年3月Chrome 89版本,所有先前的答案都已过时。Chrome现在支持用户代理提示(User Agent Hints)。因此,现在应该使用以下方式:
navigator.userAgentData?.brands?.some(b => b.brand === 'Google Chrome')
或者,如果您没有使用Babel:
navigator.userAgentData && navigator.userAgentData.brands && navigator.userAgentData.brands.some(b => b.brand === 'Google Chrome')
这将返回Chrome 89及以上版本为true,最新版Opera和Edge为false,不支持userAgentData的浏览器返回未定义。
navigator.userAgentData.brands
实际上返回浏览器品牌。其他答案的问题在于它们对基于Chromium的浏览器(如Edge)返回true
。 - TEKvar is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );~
这是一个旧的答案,写于12年前;截至目前(即2022年8月)
更新(2022年8月):
现在,使用用户代理进行浏览器检测(用户代理嗅探)通常是不好的做法。应该采用特性检测。
然而,如果你仍然希望这样做,可以使用第三方库,比如
var parser = new UAParser();
var result = parser.getResult();
console.log(result.browser);// {name: "Chrome", version: "104.0.0.0", "major": "104"}
console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
console.log(result.os); // {name: "Windows", version: "10"}
console.log(result.engine); // {name: "Blink", version: "104.0.0.0"}
console.log(result.cpu); // {"architecture": "amd64"}
<script
src="https://cdnjs.cloudflare.com/ajax/libs/UAParser.js/1.0.2/ua-parser.min.js">
</script>
true
。 - Cobbytrue
。 - Gagik如果你足够勇敢,可以尝试使用浏览器嗅探来获得一个版本:
var ua = navigator.userAgent;
if(/chrome/i.test(ua)) {
var uaArray = ua.split(' ')
, version = uaArray[uaArray.length - 2].substr(7);
}
检测到的版本可能是Chrome版本、Edge版本或其他版本。但是,浏览器插件可以轻易更改用户代理和平台等其他信息,因此不建议这样做。
向《大白杨》致歉,因为我在我的答案中使用了他的回答。
在进行浏览器检测时,可以使用一些可选的窗口属性。其中之一是可选的chrome
属性(Chromium),另一个是可选的opr
属性(Opera)。
如果浏览器的窗口对象上有可选的chrome
属性,则表示该浏览器是一个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';
}
您可以在这个示例中找到这个简化后的代码:
诀窍是首先针对其他浏览器(如Edge、Opera)进行测试。在所有这些情况下,将不同可能的浏览器标识符组合成一个正则表达式,并针对用户代理字符串进行测试。对于Chrome和Opera,还添加了关于window属性的额外测试,对于Chrome,我们还检查供应商名称是否与预期值匹配。
注意:我已经针对许多不同的用户代理进行了测试,但在此不会声称这个解决方案是无缺陷的。欢迎提出改进意见或失败的浏览器检测,以便我进一步改进此代码。
修复了对iOS上Chrome(用户代理CriOS)检测的漏洞。iOS上的Chrome没有window对象上的chrome: true
属性,所以只应测试用户代理字符串的存在。
您可以使用:
navigator.userAgent.indexOf("Chrome") != -1
navigator.userAgent.includes("Chrome")
- Alex Szücstrue
。 - Gagik