我如何识别用户浏览器并重定向(一旦单击安装按钮后)以下载相应的插件?
#1 楼
谷歌浏览器可靠检测通常会导致检查用户代理字符串。这种方法不可靠,因为欺骗这个值很简单。我已经编写了一种通过鸭子输入来检测浏览器的方法。
只有在确实需要时才使用浏览器检测方法,例如显示浏览器特定的说明来安装扩展。尽可能使用特征检测。
演示:https://jsfiddle.net/6spj1059/
// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';
// Safari 3.0+ "[object HTMLElementConstructor]"
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && window['safari'].pushNotification));
// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;
// Chrome 1 - 79
var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
// Edge (based on chromium) detection
var isEdgeChromium = isChrome && (navigator.userAgent.indexOf("Edg") != -1);
// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;
var output = 'Detecting browsers by ducktyping:<hr>';
output += 'isFirefox: ' + isFirefox + '<br>';
output += 'isChrome: ' + isChrome + '<br>';
output += 'isSafari: ' + isSafari + '<br>';
output += 'isOpera: ' + isOpera + '<br>';
output += 'isIE: ' + isIE + '<br>';
output += 'isEdge: ' + isEdge + '<br>';
output += 'isEdgeChromium: ' + isEdgeChromium + '<br>';
output += 'isBlink: ' + isBlink + '<br>';
document.body.innerHTML = output;
可靠性分析
以前的方法取决于渲染引擎(
-moz-box-sizing
和-webkit-transform
)的属性来检测浏览器。这些前缀最终将被删除,因此为了使检测更加可靠,我切换到浏览器特定的特性:Internet Explorer:JScript的条件编译(直到IE9)和
document.documentMode
。Edge :在Trident和Edge浏览器中,Microsoft的实现公开了
StyleMedia
构造函数。排除Trident会使我们留有Edge。Edge(基于铬):用户代理的末尾包括值“ Edg / [version]”(例如:“ Mozilla / 5.0(Windows NT 10.0; Win64; x64)” AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 80.0.3987.16 Safari / 537.36 Edg / 80.0.361.9“)。
Firefox:安装插件的Firefox API:
InstallTrigger
Chrome:全局
chrome
对象包含多个属性,其中包括已记录的chrome.webstore
对象。更新3
chrome.webstore
已被弃用,并且在最新版本中未定义。Safari:构造函数命名中的独特命名模式。这是所有列出的属性中最不耐用的方法,您猜怎么着?在Safari 9.1.3中已修复。因此,我们要检查7.1版本之后引入的
SafariRemoteNotification
,以涵盖3.0和更高版本中的所有Safari。Opera:
window.opera
已经存在多年了,但是当Opera用Blink + V8(由Chromium使用)替换其引擎时,将被删除。更新1:Opera 15已发布,其UA字符串看起来像Chrome,但是带有增加了“ OPR”。在此版本中,定义了
chrome
对象(但没有定义chrome.webstore
)。由于Opera会努力克隆Chrome,因此我使用了用户代理嗅探功能。更新2:
!!window.opr && opr.addons
可用于检测Opera 20+(常绿)。眨眼:
CSS.supports()
是Google引入的Blink之一。开启了Chrome28。它当然是Opera中使用的Blink。在以下设备中成功测试:
Firefox 0.8-61
Chrome 1.0-71
Opera 8.0-34
Safari 3.0-10
IE 6-11
Edge-20-42
Edge Dev-80.0.361.9
2016年11月更新,包括从9.1.3起的Safari浏览器检测功能
2018年8月更新,以更新对chrome,firefox IE和edge的最新成功测试。
2019年1月更新为修复了chrome检测(由于window.chrome.webstore弃用)并包括了最新成功的chrome测试。
于2019年12月更新,添加了基于Chromium检测的Edge(基于@Nimesh注释)。
评论
仅供参考,这不适用于Chrome扩展程序,因为window.chrome.webstore在那里未定义。尚未通过Firefox扩展程序进行检查。其他地方提到的is.js可以在Chrome和Firefox扩展程序中使用。
–nevf
16年8月31日在7:11
isSafari无法在Safari 10中使用。我要说这是一个不好的解决方案(不是我有一个好的解决方案)。无法保证您要检查的许多内容不会被其他浏览器删除或添加。每个使用此代码检查Safari的站点都因macOS Sierra或Safari 10升级而中断:(
– gman
16-9-29在5:16
但是,是否已经在这些浏览器的移动版本以及桌面版本上对此进行了测试?确实,每个平台有不同的移动版本和桌面版本。实际上,firefox具有3个用于Windows,Linux,Mac OS的二进制文件,以及2个用于Android和iOS的二进制文件。
– DrZ214
16 Dec 23'3:53
当前的Safari无法在Safari 10.1.2的
#2 楼
您可以尝试以下方法检查浏览器版本。 <!DOCTYPE html>
<html>
<body>
<p>What is the name(s) of your browser?</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
if((navigator.userAgent.indexOf("Opera") || navigator.userAgent.indexOf('OPR')) != -1 )
{
alert('Opera');
}
else if(navigator.userAgent.indexOf("Chrome") != -1 )
{
alert('Chrome');
}
else if(navigator.userAgent.indexOf("Safari") != -1)
{
alert('Safari');
}
else if(navigator.userAgent.indexOf("Firefox") != -1 )
{
alert('Firefox');
}
else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10
{
alert('IE');
}
else
{
alert('unknown');
}
}
</script>
</body>
</html>
如果只需要了解IE浏览器版本,则可以遵循以下代码。对于IE6到IE11版本,此代码效果很好。
<!DOCTYPE html>
<html>
<body>
<p>Click on Try button to check IE Browser version.</p>
<button onclick="getInternetExplorerVersion()">Try it</button>
<p id="demo"></p>
<script>
function getInternetExplorerVersion() {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
var rv = -1;
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number
{
if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
//For IE 11 >
if (navigator.appName == 'Netscape') {
var ua = navigator.userAgent;
var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null) {
rv = parseFloat(RegExp.);
alert(rv);
}
}
else {
alert('otherbrowser');
}
}
else {
//For < IE11
alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
}
return false;
}}
</script>
</body>
</html>
评论
为什么要写这么多行代码? userAgent不明确。
– igaurav
2015年10月15日上午7:00
那么Microsoft Edge呢?
–user6031759
16年6月15日在23:25
上面的答案在检查野生动物园之前先检查铬。因为Safari在useragent中将没有chrome关键字。 Safari用户代理的示例-mozilla / 5.0(macintosh; intel mac os x 10_11_5)applewebkit / 601.6.17(khtml,类似于壁虎)版本/9.1.1 safari / 601.6.17
–Golak Sarangi
16年8月17日在4:07
Stackoverflow使用此方法
–vityavv
16年9月7日在14:02
在Opera(最新版本)中进行测试时,它会为我返回“ Chrome”。为了解决这个问题,我将Opera if语句更改为:if(navigator.userAgent.indexOf(“ Opera”)!= -1 || navigator.userAgent.indexOf('OPR')!= -1)
–凯尔·瓦塞拉(Kyle Vassella)
17-12-5在23:05
#3 楼
我知道为此使用lib可能会矫kill过正,但是只是为了丰富线程,您可以检查is.js的执行方式:is.firefox();
is.ie(6);
is.not.safari();
评论
值得一提的是,它主要是在做User-Agent检测。补充了供应商检测/某些地方的功能检测。
–TygerKrash
2015年10月20日,9:50
@TygerKrash当然,你是绝对正确的。这实际上就是我对我的回答的意思:打开is.js的源代码,并检查它们的工作方式。
–拉斐尔·埃因(Rafael Eyng)
16年4月17日在16:26
jQuery曾经包含类似的属性:$ .browser.msie ...已从1.9版api.jquery.com/jquery.browser中删除
–里加
16年6月29日在9:08
@RafaelEyng:我认为执行User-Agent检测的问题在于此方法不可靠。
–HoldOffHunger
17-10-26在20:30
当您假设尚未修改UA字符串时,这绝对是最可靠的方法。它还可以正确检测操作系统(android,win,mac,linux);设备类型(台式机,平板电脑,移动设备)。它还可以测试浏览器的版本。
–kashiraja
19年2月17日在7:23
#4 楼
这是截至2019年12月的几个处理浏览器检测的著名库。Bowser by lancedikson-4,065★s-最近更新于2019年10月2日-4.8KB
var result = bowser.getParser(window.navigator.userAgent);
console.log(result);
document.write("You are using " + result.parsedResult.browser.name +
" v" + result.parsedResult.browser.version +
" on " + result.parsedResult.os.name);
<script src="https://unpkg.com/bowser@2.7.0/es5.js"></script>
*支持基于Chromium的Edge
Platform.js by bestiejs-2,550★s-最近更新-2019年4月14日-5.9KB
console.log(platform);
document.write("You are using " + platform.name +
" v" + platform.version +
" on " + platform.os);
<script src="https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.5/platform.min.js"></script>
jQuery浏览器,由gabceb-504★s-最近更新,2015年11月23日-1.3KB
console.log($.browser)
document.write("You are using " + $.browser.name +
" v" + $.browser.versionNumber +
" on " + $.browser.platform);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-browser/0.1.0/jquery.browser.min.js"></script>
Detect.js(已归档),由darcyclarke-522★s-最近更新-2015年10月26日-2.9KB
var result = detect.parse(navigator.userAgent);
console.log(result);
document.write("You are using " + result.browser.family +
" v" + result.browser.version +
" on " + result.os.family);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.min.js"></script>
QuirksMode的浏览器检测(已存档)-2013年11月14日最新更新-884B
console.log(BrowserDetect)
document.write("You are using " + BrowserDetect.browser +
" v" + BrowserDetect.version +
" on " + BrowserDetect.OS);
<script src="https://kylemit.github.io/libraries/libraries/BrowserDetect.js"></script>
值得注意的提要:
WhichBrowser-1,355★s-最后更新于2018年10月2日
Modernizr-23,397★s-最后更新于2019年1月12日-要喂饱一匹马,特征检测应该会引发任何canIuse风格的问题。浏览器检测实际上只是为单个浏览器提供定制的图像,下载文件或说明。
进一步阅读
堆栈溢出-JavaScript中的浏览器检测? br />堆栈溢出-如何检测浏览器的版本?
评论
不浪费轮子就值得几Kb的开销。
–字形
3月13日21:36
#5 楼
万一有人发现它有用,我将Rob W的答案做成一个返回浏览器字符串的函数,而不是在上面浮动多个变量。由于浏览器也无法真正进行更改而不重新加载,因此我使它缓存了结果,以防止下次调用该函数时需要对其进行处理。 /**
* Gets the browser name or returns an empty string if unknown.
* This function also caches the result to provide for any
* future calls this function has.
*
* @returns {string}
*/
var browser = function() {
// Return cached result if avalible, else get result then cache it.
if (browser.prototype._cachedResult)
return browser.prototype._cachedResult;
// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';
// Safari 3.0+ "[object HTMLElementConstructor]"
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;
// Chrome 1+
var isChrome = !!window.chrome && !!window.chrome.webstore;
// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;
return browser.prototype._cachedResult =
isOpera ? 'Opera' :
isFirefox ? 'Firefox' :
isSafari ? 'Safari' :
isChrome ? 'Chrome' :
isIE ? 'IE' :
isEdge ? 'Edge' :
isBlink ? 'Blink' :
"Don't know";
};
console.log(browser());
评论
在Edge浏览器中,它将返回Chrome
– Riz
16-12-29在11:25
@eFriend我更新了最新浏览器测试的答案。
– pilau
17年2月8日在10:11
我喜欢这个,但是我宁愿使用userAgent()的后备,而不是“不知道”。
–HoldOffHunger
17-10-26在19:39
在Chrome 71中,属性window.chrome.webstore已被删除,因此该方法不再起作用。
–贝德拉
18/12/19在10:34
您可以使用仅返回cachedResult并省略if语句的函数覆盖该函数。第一次,您仍然必须返回结果。浏览器= function(){return cachedResult};返回cachedResult;
– Timar Ivo Batis
19年7月15日在14:59
#6 楼
简短变体(更新2020年7月10日移动浏览器检测修复) var browser = (function() {
var test = function(regexp) {return regexp.test(window.navigator.userAgent)}
switch (true) {
case test(/edg/i): return "Microsoft Edge";
case test(/trident/i): return "Microsoft Internet Explorer";
case test(/firefox|fxios/i): return "Mozilla Firefox";
case test(/opr\//i): return "Opera";
case test(/ucbrowser/i): return "UC Browser";
case test(/samsungbrowser/i): return "Samsung Browser";
case test(/chrome|chromium|crios/i): return "Google Chrome";
case test(/safari/i): return "Apple Safari";
default: return "Other";
}
})();
console.log(browser)
评论
如果您不喜欢我,请解释原因。
– Alex Nikulin
18 Mar 23 '18 at 11:16
这将在ios上使用“ chrome”浏览时显示“ safari”
– Reza
19年3月13日在19:06
此方法适用于台式机上的Chrome和Firefox,以及iOS上的Safari。在iOS上使用Chrome和Firefox失败。
–BReddy
7月9日在1:09
@BReddy请对此进行重新测试,我没有任何苹果设备:)
– Alex Nikulin
7月9日11:42
我使用Firefox(在Win10上为78.0.1),Chrome(在Win10上为83.0),Edge(在Win10上为83.0-Chromium基础),Firefox(在iOS上为27)和Chrome(在iOS上为83.0)成功进行了测试。此逻辑仍然报告Safari(在iOS 13.5.1上)仍报告为“ chrome”。难道是因为Chromium源自WebKit基础吗?
–BReddy
7月9日在16:24
#7 楼
这是Rob答案的2016年调整版本,包括Microsoft Edge和Blink的检测:(编辑:我用此信息更新了上面的Rob答案)。
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
isFirefox = typeof InstallTrigger !== 'undefined';
// Safari 3.0+
isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
// Internet Explorer 6-11
isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
isEdge = !isIE && !!window.StyleMedia;
// Chrome 1+
isChrome = !!window.chrome && !!window.chrome.webstore;
// Blink engine detection
isBlink = (isChrome || isOpera) && !!window.CSS;
/* Results: */
console.log("isOpera", isOpera);
console.log("isFirefox", isFirefox);
console.log("isSafari", isSafari);
console.log("isIE", isIE);
console.log("isEdge", isEdge);
console.log("isChrome", isChrome);
console.log("isBlink", isBlink);
这种方法的优点在于它依赖于浏览器引擎属性,因此,它甚至涵盖了派生的浏览器,例如Yandex或Vivaldi,它们实际上与主要引擎兼容。采用。 Opera是一个例外,它依赖于用户代理嗅探,但是今天(即15版及更高版本)甚至Opera本身仅是Blink的外壳。
评论
!! window.MSAssertion;通过远程桌面在Edge beta中测试对我不起作用。返回false。
– NoR
16年1月20日在16:45
@NoR您正在使用哪个版本的Edge?重要
– pilau
16年1月20日在16:59
@NoR哦,您正在使用VM ... MSAssertion技巧已调整为版本25。但是由于许多开发人员都依赖于VM,因此我将尝试将其调整为此旧版本。好决定。谢谢。
– pilau
16 Jan 20 '17:42
@NoR已更新-应该是面向未来的。 StyleMedia(大写)对象特定于IE和Edge,似乎没有用。
– pilau
16年1月20日在20:07
我还发现UAParser是一个js插件,该插件仍保持不变,并且非常准确且易于使用。
–艾萨克·山墙
17年8月14日在16:08
#8 楼
不知道它是否对任何人都有用,但是这是一个可使TypeScript满意的变体:export function getBrowser() {
// Opera 8.0+
if ((!!window["opr"] && !!["opr"]["addons"]) || !!window["opera"] || navigator.userAgent.indexOf(' OPR/') >= 0) {
return 'opera';
}
// Firefox 1.0+
if (typeof window["InstallTrigger"] !== 'undefined') {
return 'firefox';
}
// Safari 3.0+ "[object HTMLElementConstructor]"
if (/constructor/i.test(window["HTMLElement"]) || (function(p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof window["safari"] !== 'undefined' && window["safari"].pushNotification))) {
return 'safari';
}
// Internet Explorer 6-11
if (/*@cc_on!@*/false || !!document["documentMode"]) {
return 'ie';
}
// Edge 20+
if (!(/*@cc_on!@*/false || !!document["documentMode"]) && !!window["StyleMedia"]) {
return 'edge';
}
// Chrome 1+
if (!!window["chrome"] && !!window["chrome"].webstore) {
return 'chrome';
}
// Blink engine detection
if (((!!window["chrome"] && !!window["chrome"].webstore) || ((!!window["opr"] && !!["opr"]["addons"]) || !!window["opera"] || navigator.userAgent.indexOf(' OPR/') >= 0)) && !!window["CSS"]) {
return 'blink';
}
}
评论
为什么会有一些以“ false”为条件的if?
–约纳坦·尼尔(Yonatan Nir)
19-10-28在11:45
@YonatanNir我认为它旨在检测条件编译:developer.mozilla.org/en-US/docs/Web/JavaScript/…
–卢卡斯·阿兹维多(Lucas Azevedo)
3月5日12:13
#9 楼
您可以使用try
和catch
来使用不同的浏览器错误消息。IE和edge混杂在一起,但是我使用了Rob W的鸭子输入(基于此处的项目:https://www.khanacademy.org / computer-programming / i-have-opera / 2395080328)。
var getBrowser = function() {
try {
var e;
var f = e.width;
} catch(e) {
var err = e.toString();
if(err.indexOf("not an object") !== -1) {
return "safari";
} else if(err.indexOf("Cannot read") !== -1) {
return "chrome";
} else if(err.indexOf("e is undefined") !== -1) {
return "firefox";
} else if(err.indexOf("Unable to get property 'width' of undefined or null reference") !== -1) {
if(!(false || !!document.documentMode) && !!window.StyleMedia) {
return "edge";
} else {
return "IE";
}
} else if(err.indexOf("cannot convert e into object") !== -1) {
return "opera";
} else {
return undefined;
}
}
};
评论
这是一个好主意:您不需要“窗口”或“导航器”对象!
–Vadim
17年12月13日在15:42
我的建议是彻底清除文件和窗口。参见IE块:返回“ firefox”; } else if(err.search(“ [对象错误]”)!== -1 && e.message!= null && e.description!= null){返回“ IE”; } else if(err.search(“无法将e转换为对象”)!== -1){返回“ opera”;
–Vadim
17/12/13在16:07
如何区分IE和Edge?
–梅森·琼斯(Mason Jones)
17年12月18日在18:40
奇怪,我再也无法再现err.search(“ [object Error]”)。无论如何,对我来说,Firefox,Chrome和其他东西就足够了。我在窗口和文档对象不可用的PAC文件中使用它。
–Vadim
17年12月21日在12:05
只是找出原因。看起来好像是为了充填PAC文件,Windows 7不使用安装在我的计算机上的IE11,而是使用类似IE7的引擎(可能来自Windows主机)。因此,err.toString()给出了“ [object Error]”,而在IE11内部给出了“无法获取属性...”字符串,如代码中所示。因此,上面的代码将在IE7上失败。
–Vadim
17年12月21日在12:19
#10 楼
谢谢大家。我在以下最新的浏览器上测试了代码段:Chrome 55,Firefox 50,IE 11和Edge 38,并提出了以下组合,它们对我所有的浏览器都有效。我敢肯定它可以改进,但是它是满足任何人的快速解决方案:var browser_name = '';
isIE = /*@cc_on!@*/false || !!document.documentMode;
isEdge = !isIE && !!window.StyleMedia;
if(navigator.userAgent.indexOf("Chrome") != -1 && !isEdge)
{
browser_name = 'chrome';
}
else if(navigator.userAgent.indexOf("Safari") != -1 && !isEdge)
{
browser_name = 'safari';
}
else if(navigator.userAgent.indexOf("Firefox") != -1 )
{
browser_name = 'firefox';
}
else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10
{
browser_name = 'ie';
}
else if(isEdge)
{
browser_name = 'edge';
}
else
{
browser_name = 'other-browser';
}
$('html').addClass(browser_name);
它为HTML添加了CSS类,并带有浏览器的名称。 。
评论
您是否在ios上测试了chrome?
–维克
19/12/20在17:13
#11 楼
在台式机和移动设备上检测浏览器:Edge,Opera,Chrome,Safari,Firefox,IE我在@nimesh代码中做了一些更改,现在它也适用于Edge,
和Opera问题已修复:
function getBrowserName() {
if ( navigator.userAgent.indexOf("Edge") > -1 && navigator.appVersion.indexOf('Edge') > -1 ) {
return 'Edge';
}
else if( navigator.userAgent.indexOf("Opera") != -1 || navigator.userAgent.indexOf('OPR') != -1 )
{
return 'Opera';
}
else if( navigator.userAgent.indexOf("Chrome") != -1 )
{
return 'Chrome';
}
else if( navigator.userAgent.indexOf("Safari") != -1)
{
return 'Safari';
}
else if( navigator.userAgent.indexOf("Firefox") != -1 )
{
return 'Firefox';
}
else if( ( navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true ) ) //IF IE > 10
{
return 'IE';
}
else
{
return 'unknown';
}
}
感谢@nimesh用户:2063564
#12 楼
还有一种不太“ hacky”的方法适用于所有流行的浏览器。Google在其Closure库中包含了一个浏览器检查功能。特别要看一下
goog.userAgent
和goog.userAgent.product
。这样,如果浏览器呈现的方式发生了某些变化,您也可以保持最新(假设您始终运行最新版本的闭包编译器。)评论
如果大多数答案是唯一可靠的方法,则大多数答案都与“ hacky”无关。如多次提到的那样,userAgent很容易被欺骗,因此是不可靠的。
–HoldOffHunger
17-10-26在19:43
#13 楼
如果您需要了解某些特定浏览器的数字版本,可以使用以下代码段。目前,它将告诉您Chrome / Chromium / Firefox的版本:var match = $window.navigator.userAgent.match(/(?:Chrom(?:e|ium)|Firefox)\/([0-9]+)\./);
var ver = match ? parseInt(match[1], 10) : 0;
#14 楼
UAParser是轻量级JavaScript库之一,可从userAgent字符串识别浏览器,引擎,操作系统,CPU和设备类型/模型。有CDN可用。在这里,我提供了一个示例代码来使用UAParser检测浏览器。
<!doctype html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/ua-parser-js@0/dist/ua-parser.min.js"></script>
<script type="text/javascript">
var parser = new UAParser();
var result = parser.getResult();
console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"}
</script>
</head>
<body>
</body>
</html>
现在您可以使用
result.browser
的值对页面进行有条件的编程了。 br />源教程:如何使用JavaScript检测浏览器,引擎,操作系统,CPU和设备?评论
一千行代码称为轻量级代码?
–deathangel908
18年6月25日在15:44
#15 楼
var BrowserDetect = {
init: function () {
this.browser = this.searchString(this.dataBrowser) || "Other";
this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "Unknown";
},
searchString: function (data) {
for (var i = 0; i < data.length; i++) {
var dataString = data[i].string;
this.versionSearchString = data[i].subString;
if (dataString.indexOf(data[i].subString) !== -1) {
return data[i].identity;
}
}
},
searchVersion: function (dataString) {
var index = dataString.indexOf(this.versionSearchString);
if (index === -1) {
return;
}
var rv = dataString.indexOf("rv:");
if (this.versionSearchString === "Trident" && rv !== -1) {
return parseFloat(dataString.substring(rv + 3));
} else {
return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
}
},
dataBrowser: [
{string: navigator.userAgent, subString: "Edge", identity: "MS Edge"},
{string: navigator.userAgent, subString: "MSIE", identity: "Explorer"},
{string: navigator.userAgent, subString: "Trident", identity: "Explorer"},
{string: navigator.userAgent, subString: "Firefox", identity: "Firefox"},
{string: navigator.userAgent, subString: "Opera", identity: "Opera"},
{string: navigator.userAgent, subString: "OPR", identity: "Opera"},
{string: navigator.userAgent, subString: "Chrome", identity: "Chrome"},
{string: navigator.userAgent, subString: "Safari", identity: "Safari"}
]
};
BrowserDetect.init();
var bv= BrowserDetect.browser;
if( bv == "Chrome"){
$("body").addClass("chrome");
}
else if(bv == "MS Edge"){
$("body").addClass("edge");
}
else if(bv == "Explorer"){
$("body").addClass("ie");
}
else if(bv == "Firefox"){
$("body").addClass("Firefox");
}
$(".relative").click(function(){
$(".oc").toggle('slide', { direction: 'left', mode: 'show' }, 500);
$(".oc1").css({
'width' : '100%',
'margin-left' : '0px',
});
});
#16 楼
您可以使用Detect-browser.js这个JavaScript库,该库检测并打印浏览器信息的对象,包括浏览器语言/名称,用户代理,设备类型,用户操作系统,引荐来源网址,在线/ 0ffline,用户时区,屏幕分辨率和启用的cookie 。从这里获取detect-browser.js
它会给你类似的东西:
#17 楼
这是我的自定义解决方案。 const inBrowser = typeof window !== 'undefined'
const UA = inBrowser && window.navigator.userAgent.toLowerCase()
const isIE =
UA && /; msie|trident/i.test(UA) && !/ucbrowser/i.test(UA).test(UA)
const isEdge = UA && /edg/i.test(UA)
const isAndroid = UA && UA.indexOf('android') > 0
const isIOS = UA && /iphone|ipad|ipod|ios/i.test(UA)
const isChrome =
UA &&
/chrome|crios/i.test(UA) &&
!/opr|opera|chromium|edg|ucbrowser|googlebot/i.test(UA)
const isGoogleBot = UA && /googlebot/i.test(UA)
const isChromium = UA && /chromium/i.test(UA)
const isUcBrowser = UA && /ucbrowser/i.test(UA)
const isSafari =
UA &&
/safari/i.test(UA) &&
!/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i.test(UA)
const isFirefox = UA && /firefox|fxios/i.test(UA) && !/seamonkey/i.test(UA)
const isOpera = UA && /opr|opera/i.test(UA)
const isMobile =
/\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
/\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA)
const isSamsung = UA && /samsungbrowser/i.test(UA)
const isIPad = UA && /ipad/.test(UA)
const isIPhone = UA && /iphone/.test(UA)
const isIPod = UA && /ipod/.test(UA)
console.log({
UA,
isAndroid,
isChrome,
isChromium,
isEdge,
isFirefox,
isGoogleBot,
isIE,
isMobile,
isIOS,
isIPad,
isIPhone,
isIPod,
isOpera,
isSafari,
isSamsung,
isUcBrowser,
}
}
#18 楼
结合了Rob的原始答案和Pilau的2016年更新 var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;
// Chrome 1+
var output = 'Detecting browsers by ducktyping:<hr>';
output += 'isFirefox: ' + isFirefox + '<br>';
output += 'isChrome: ' + isChrome + '<br>';
output += 'isSafari: ' + isSafari + '<br>';
output += 'isOpera: ' + isOpera + '<br>';
output += 'isIE: ' + isIE + '<br>';
output += 'isIE Edge: ' + isEdge + '<br>';
document.body.innerHTML = output;
评论
是否有必要告诉用户他们正在使用哪种浏览器?我想他们已经知道这一点。
–HoldOffHunger
17-10-26在19:56
@HoldOffHunger,其主要目的是使最兼容的代码适应活动的浏览器,而不是告知用户他们正在使用哪个浏览器。除非他们使用的浏览器是过时的,并且已被排除在向后兼容之外,否则,只要切换到最新版本,让用户知道他们可以从更好的体验中受益就不会受到损害。
–乔·伯格
17年11月2日在6:16
#19 楼
在这里,您可以找到正在运行的浏览器。function isValidBrowser(navigator){
var isChrome = navigator.indexOf('chrome'),
isFireFox= navigator.indexOf('firefox'),
isIE = navigator.indexOf('trident') ,
isValidChromeVer = parseInt(navigator.substring(isChrome+7, isChrome+8)) >= 4,
isValidFireForVer = parseInt(navigator.substring(isFireFox+8, isFireFox+9)) >= 3,
isValidIEVer = parseInt(navigator.substring(isIE+8, isIE+9)) >= 7;
if((isChrome > -1 && isValidChromeVer){ console.log("Chrome Browser")}
if(isFireFox > -1 && isValidFireForVer){ console.log("FireFox Browser")}
if(isIE > -1 && isValidIEVer)){ console.log("IE Browser")}
}
#20 楼
我们可以使用以下util方法utils.isIE = function () {
var ver = navigator.userAgent;
return ver.indexOf("MSIE") !== -1 || ver.indexOf("Trident") !== -1; // need to check for Trident for IE11
};
utils.isIE32 = function () {
return (utils.isIE() && navigator.appVersion.indexOf('Win64') === -1);
};
utils.isChrome = function () {
return (window.chrome);
};
utils.isFF64 = function () {
var agent = navigator.userAgent;
return (agent.indexOf('Win64') >= 0 && agent.indexOf('Firefox') >= 0);
};
utils.isFirefox = function () {
return (navigator.userAgent.toLowerCase().indexOf('firefox') > -1);
};
#21 楼
const isChrome = /Chrome/.test(navigator.userAgent)
const isFirefox = /Firefox/.test(navigator.userAgent)
评论
不幸的是,这不是一个好答案。 Edge在他的userAgent消息中包含Chrome。最好使用!! window.chrome &&(!! window.chrome.webstore || !! window.chrome.runtime);
–普热莫
4月18日13:49
您的答案对于Opera浏览器也失败
–兰达达
10月8日下午16:41
#22 楼
检测浏览器及其版本此代码段基于MDN的文章。他们在其中简要提示了可用于检测浏览器名称的各种关键字。
上图中的数据不足以检测所有浏览器,例如: Firefox的userAgent将使用Fxios作为关键字,而不是Firefox。
还进行了一些更改以检测Edge和UCBrowser之类的浏览器。
目前,通过在userAgent的帮助下更改userAgent,针对以下浏览器测试了该代码开发人员工具(如何更改userAgent):
FireFox
Chrome
IE
Edge
Opera
Safari
UCBrowser
getBrowser = () => {
const userAgent = navigator.userAgent;
let browser = "unkown";
// Detect browser name
browser = (/ucbrowser/i).test(userAgent) ? 'UCBrowser' : browser;
browser = (/edg/i).test(userAgent) ? 'Edge' : browser;
browser = (/googlebot/i).test(userAgent) ? 'GoogleBot' : browser;
browser = (/chromium/i).test(userAgent) ? 'Chromium' : browser;
browser = (/firefox|fxios/i).test(userAgent) && !(/seamonkey/i).test(userAgent) ? 'Firefox' : browser;
browser = (/; msie|trident/i).test(userAgent) && !(/ucbrowser/i).test(userAgent) ? 'IE' : browser;
browser = (/chrome|crios/i).test(userAgent) && !(/opr|opera|chromium|edg|ucbrowser|googlebot/i).test(userAgent) ? 'Chrome' : browser;;
browser = (/safari/i).test(userAgent) && !(/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i).test(userAgent) ? 'Safari' : browser;
browser = (/opr|opera/i).test(userAgent) ? 'Opera' : browser;
// detect browser version
switch (browser) {
case 'UCBrowser': return `${browser}/${browserVersion(userAgent,/(ucbrowser)\/([\d\.]+)/i)}`;
case 'Edge': return `${browser}/${browserVersion(userAgent,/(edge|edga|edgios|edg)\/([\d\.]+)/i)}`;
case 'GoogleBot': return `${browser}/${browserVersion(userAgent,/(googlebot)\/([\d\.]+)/i)}`;
case 'Chromium': return `${browser}/${browserVersion(userAgent,/(chromium)\/([\d\.]+)/i)}`;
case 'Firefox': return `${browser}/${browserVersion(userAgent,/(firefox|fxios)\/([\d\.]+)/i)}`;
case 'Chrome': return `${browser}/${browserVersion(userAgent,/(chrome|crios)\/([\d\.]+)/i)}`;
case 'Safari': return `${browser}/${browserVersion(userAgent,/(safari)\/([\d\.]+)/i)}`;
case 'Opera': return `${browser}/${browserVersion(userAgent,/(opera|opr)\/([\d\.]+)/i)}`;
case 'IE': const version = browserVersion(userAgent,/(trident)\/([\d\.]+)/i);
// IE version is mapped using trident version
// IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0
return version ? `${browser}/${parseFloat(version) + 4.0}` : `${browser}/7.0`;
default: return `unknown/0.0.0.0`;
}
}
browserVersion = (userAgent,regex) => {
return userAgent.match(regex) ? userAgent.match(regex)[2] : null;
}
console.log(getBrowser());
#23 楼
您可以像这样检测到它:if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) {
alert('Firefox');
}
#24 楼
简单: var OSName="Unknown OS";
if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
if (navigator.appVersion.indexOf("Linux x86_64")!=-1) OSName="Ubuntu";
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browserName = navigator.appName;
var fullVersion = ''+parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion,10);
var nameOffset,verOffset,ix;
// In Opera, the true version is after "Opera" or after "Version"
if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
browserName = "Opera";
fullVersion = nAgt.substring(verOffset+6);
if ((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion = nAgt.substring(verOffset+8);
}
// In MSIE, the true version is after "MSIE" in userAgent
else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
browserName = "Microsoft Internet Explorer";
fullVersion = nAgt.substring(verOffset+5);
}
// In Chrome, the true version is after "Chrome"
else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) {
browserName = "Chrome";
fullVersion = nAgt.substring(verOffset+7);
}
// In Safari, the true version is after "Safari" or after "Version"
else if ((verOffset=nAgt.indexOf("Safari"))!=-1) {
browserName = "Safari";
fullVersion = nAgt.substring(verOffset+7);
if ((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion = nAgt.substring(verOffset+8);
}
// In Firefox, the true version is after "Firefox"
else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) {
browserName = "Firefox";
fullVersion = nAgt.substring(verOffset+8);
}
// In most other browsers, "name/version" is at the end of userAgent
else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) <
(verOffset=nAgt.lastIndexOf('/')) )
{
browserName = nAgt.substring(nameOffset,verOffset);
fullVersion = nAgt.substring(verOffset+1);
if (browserName.toLowerCase()==browserName.toUpperCase()) {
browserName = navigator.appName;
}
}
// trim the fullVersion string at semicolon/space if present
if ((ix=fullVersion.indexOf(";"))!=-1)
fullVersion=fullVersion.substring(0,ix);
if ((ix=fullVersion.indexOf(" "))!=-1)
fullVersion=fullVersion.substring(0,ix);
majorVersion = parseInt(''+fullVersion,10);
if (isNaN(majorVersion)) {
fullVersion = ''+parseFloat(navigator.appVersion);
majorVersion = parseInt(navigator.appVersion,10);
}
document.write(''
+'Hey! i see you\'re using '+browserName+'! <br>'
+'The full version of it is '+fullVersion+'. <br>'
+'Your major version is '+majorVersion+', <br>'
+'And your "navigator.appName" is '+navigator.appName+'. <br>'
+'Your "navigator.userAgent" is '+navigator.userAgent+'. <br>'
)
document.write('And, your OS is '+OSName+'. <br>');
评论
我来自带有Microsoft Edge浏览器的android。您的代码说我是“ chrome ubuntu”
– Alex Nikulin
7月16日15:05
#25 楼
简单的一行JavaScript代码将为您提供浏览器的名称:function GetBrowser()
{
return navigator ? navigator.userAgent.toLowerCase() : "other";
}
评论
仅userAgent不能告诉我们足够的信息。例如,我的用户代理是“ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_10_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 45.0.2454.85 Safari / 537.36”,其中提到了Mozilla,Chrome和Safari。我是哪种浏览器?
–eremzeit
2015年9月11日在22:39
抱歉,“我是哪个浏览器类型?”却没让您了解你想得到什么?
– Nirav Mehta
2015年9月12日下午4:56
@NiravMehta他的意思是navigator.userAgent告诉您所有可能的浏览器。因此,这确实不可靠,唯一可行的情况是用户只有一个浏览器。
–Baldráni
16 Mar 8 '16 at 9:41
这不是检测浏览器的可靠方法。有些用户代理同时包含chrome和safari,因此无法检测到我们应该考虑并持续使用哪一个,但同样重要的是,可以通过网页修改用户代理。
– Juvenik
17年6月27日在5:40
评论
尝试detectjs,它可用于所有浏览器JavaScript中浏览器检测可能重复吗?
detect.js不再维护(根据github.com/darcyclarke/Detect.js),他们推荐github.com/lancedikson/bowser
我使用了UAParser插件,它是用Vanilla JavaScript编写的。资料来源:如何使用JavaScript检测浏览器,引擎,操作系统,CPU和设备?
如何发现浏览器版本的可能重复项?