如何检测Safari,Chrome,IE,Firefox和Opera浏览器?

问题描述 投票:672回答:20

我有FF,Chrome,IE,Opera和Safari的5个插件/扩展。

如何识别用户浏览器并重定向(单击安装按钮后)以下载相应的插件?

javascript browser-detection
20个回答
1494
投票

用于浏览器可靠检测的Google搜索通常会导致检查用户代理字符串。这种方法不可靠,因为欺骗这个值是微不足道的。 我写了一个方法来检测duck-typing的浏览器。

如果确实有必要,请仅使用浏览器检测方法,例如显示特定于浏览器的指令以安装扩展程序。尽可能使用特征检测。

但是:Kua zxsw指出

可靠性分析

// 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' && safari.pushNotification)); // Internet Explorer 6-11 var isIE = /*@cc_on!@*/false || !!document.documentMode; // Edge 20+ var isEdge = !isIE && !!window.StyleMedia; // Chrome 1 - 71 var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime); // 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 += 'isBlink: ' + isBlink + '<br>'; document.body.innerHTML = output;依赖于渲染引擎(previous method-moz-box-sizing)的属性来检测浏览器。这些前缀最终将被删除,因此为了使检测更加健壮,我切换到特定于浏览器的特性:

  • Internet Explorer:JScript的-webkit-transform(直到IE9)和Conditional compilation
  • Edge:在Trident和Edge浏览器中,Microsoft的实现公开了document.documentMode构造函数。不包括Trident让我们离开Edge。
  • Firefox:Firefox用于安装附加组件的API:StyleMedia
  • Chrome:全局InstallTrigger对象,包含多个属性,包括记录的chrome对象。 更新3 chrome.webstore在最近的版本中已弃用且未定义
  • Safari:构造函数命名中的唯一命名模式。这是所有列出的属性中最不耐用的方法,猜猜是什么?在Safari 9.1.3中,它已得到修复。因此,我们正在检查在版本7.1之后引入的chrome.webstore,以涵盖3.0及以上的所有Safaris。
  • Opera:SafariRemoteNotification已存在多年,但当Opera用Blink + V8(由Chromium使用)取代其引擎时,window.opera。 更新1:will be dropped,其UA字符串看起来像Chrome,但增加了“OPR”。在这个版本中定义了Opera 15 has been released对象(但chrome不是)。由于Opera努力克隆Chrome,我使用用户代理嗅探来实现此目的。 更新2:chrome.webstore可用于检测!!window.opr && opr.addons(常绿)。
  • 一旦Google打开Chrome 28,就会闪烁:Opera 20+ CSS.supports()。当然,这与Opera中使用的Blink相同。

成功通过以下测试:

  • Firefox 0.8 - 61
  • Chrome 1.0 - 71
  • Opera 8.0 - 34
  • Safari 3.0 - 10
  • IE 6 - 11
  • 边缘 - 20-42

2016年11月更新,包括检测9.1.3及更高版本的Safari浏览器

在2018年8月更新,以更新有关chrome,firefox IE和edge的最新成功测试。

在2019年1月更新以修复chrome检测(因为window.chrome.webstore已弃用)并包含最新的chrome成功测试。


5
投票

不知道它对任何人是否有用,但这里有一个让TypeScript开心的变种。

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;
        }
    }
};

}


4
投票

还有一种不太“hacky”的方法适用于所有流行的浏览器。谷歌在他们的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'; } 中加入了浏览器检查。特别是,看看Closure Librarygoog.userAgent。通过这种方式,如果浏览器呈现方式发生变化,您也可以更新(假设您始终运行最新版本的闭包编译器。)


4
投票

如果您需要知道某些特定浏览器的数字版本,可以使用以下代码段。目前它会告诉你Chrome / Chromium / Firefox的版本:

goog.userAgent.product

3
投票

在桌面和移动设备上检测浏览器:Edge,Opera,Chrome,Safari,Firefox,IE

我在@nimesh代码中做了一些更改,现在它也适用于Edge,并修复了Opera问题:

var match = $window.navigator.userAgent.match(/(?:Chrom(?:e|ium)|Firefox)\/([0-9]+)\./);
var ver = match ? parseInt(match[1], 10) : 0;

谢谢@nimesh用户:2063564


2
投票

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'; } } 是轻量级JavaScript库之一,用于从userAgent字符串中识别浏览器,引擎,操作系统,CPU和设备类型/模型。

有一个CDN可用。在这里,我已经包含了一个使用UAParser检测浏览器的示例代码。

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



1
投票
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',
   });
});

0
投票

const isChrome = /Chrome/.test(navigator.userAgent) const isFirefox = /Firefox/.test(navigator.userAgent) 结合了Rob的原始答案和2016年Pilau的更新

This

0
投票

在这里,您可以找到它正在运行的浏览器。

    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;

0
投票

我们可以使用下面的util方法

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")}


        }

115
投票

您可以尝试以下方式检查浏览器版本。

was introduced in Blink

如果您只需要知道IE浏览器版本,那么您可以按照以下代码。此代码适用于IE6到IE11的版本

    <!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>

-2
投票

简单的单行JavaScript代码将为您提供浏览器的名称:

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);
    };

58
投票

我知道使用lib可能有点过分,但只是为了丰富线程,你可以检查<!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.$1); alert(rv); } } else { alert('otherbrowser'); } } else { //For < IE11 alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)))); } return false; }} </script> </body> </html> 这样做的方法:

is.js

43
投票

如果有人发现这个有用,我已经将is.firefox(); is.ie(6); is.not.safari(); 变成了一个返回浏览器字符串而不是浮动多个变量的函数。由于浏览器在没有重新加载的情况下也无法真正改变,我已经使其缓存结果以防止它在下次调用函数时需要将其解决。


32
投票

以下是几个处理浏览器检测的着名库,截至2019年5月。

/** * 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()); by lancedikson - 3,761★s - Last updated May 26, 2019 - 4.8KB

Bowser
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);

*支持基于Chromium的Edge


<script src="https://unpkg.com/[email protected]/es5.js"></script> by bestiejs - 2,250★s - Last updated Oct 30, 2018 - 5.9KB

Platform.js
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> by gabceb - 504★s - Last updated Nov 23, 2015 - 1.3KB

jQuery Browser
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> by darcyclarke - 522★s - Last updated Oct 26, 2015 - 2.9KB

Detect.js (Archived)
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> by QuirksMode - Last updated Nov 14, 2013 - 884B

Browser Detect (Archived)
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> - 1,355★s - 最后更新时间为2018年10月2日
  • WhichBrowser - 23,397★s - 最后更新时间:2019年1月12日 - 要喂养一匹美联储的马,特征检测应该驱动任何Modernizr风格的问题。浏览器检测实际上只是为各个浏览器提供自定义图像,下载文件或说明。

进一步阅读



11
投票

这是Rob的答案的2016年调整版,包括Microsoft Edge和Blink的检测:

(编辑:我用上述信息更新了Rob的答案。)

var browser = (function(){
  var test = function(regexp) { return regexp.test(window.navigator.userAgent);}
  switch(true){
	case test(/edge/i): return "edge";
	case test(/opr/i) && (!!window.opr || !!window.opera): return "opera";
	case test(/chrome/i) && !!window.chrome: return "chrome";
	case test(/trident/i) : return "ie";
	case test(/firefox/i) : return "firefox";
	case test(/safari/i): return "safari";
	default: return "other";
  }
})();
console.log(browser)

这种方法的优点在于它依赖于浏览器引擎属性,因此它甚至涵盖了衍生浏览器,例如Yandex或Vivaldi,它们实际上与他们使用的引擎的主要浏览器兼容。唯一的例外是Opera,它依赖于用户代理嗅探,但今天(即版本15及以上)甚至Opera本身只是Blink的一个shell。


8
投票

谢谢大家。我在最近的浏览器上测试了代码片段:Chrome 55,Firefox 50,IE 11和Edge 38,我想出了以下组合,这些组合对我来说都适用。我确信它可以改进,但它是一个快速的解决方案,无论谁需要:

// 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);

它为HTML添加了一个CSS类,其中包含浏览器的名称。


7
投票

您可以使用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); try来使用不同的浏览器错误消息。 IE和边缘混在一起,但我使用了Rob W的鸭子打字(基于这个项目:catch)。

https://www.khanacademy.org/computer-programming/i-have-opera/2395080328
© www.soinside.com 2019 - 2024. All rights reserved.