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

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

我需要代码来识别用户浏览器并重定向(点击安装按钮)以下载相应的插件。


Google浏览器可靠检测通常会导致检查用户代理字符串。 这种方法可靠,因为欺骗这个值是微不足道的。
我已经编写了一种通过鸭式打印来检测浏览器的方法。

如果真的有必要,请仅使用浏览器检测方法,例如显示特定于浏览器的指令来安装扩展。 尽可能使用功能检测。

演示:https://jsfiddle.net/311aLtkz/

// 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+
var isChrome = !!window.chrome && !!window.chrome.webstore;

// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;

可靠性分析

前面的方法取决于渲染引擎的属性( -moz-box-sizing-webkit-transform )来检测浏览器。 这些前缀最终会被删除,因此为了使检测更加健壮,我转而使用了浏览器特有的特性:

  • Internet Explorer:JScript的条件编译(直到IE9)和document.documentMode
  • 边缘:在Trident和Edge浏览器中,Microsoft的实现暴露了StyleMedia构造函数。 不包括三叉戟给我们留下了Edge。
  • Firefox:用于安装附件的Firefox API: InstallTrigger
  • Chrome:全球chrome对象,包含多个属性,包括记录的chrome.webstore对象。
  • Safari:构造函数命名中的唯一命名模式。 这是所有列出的属性中最不耐久的方法,并猜测是什么? 在Safari 9.1.3中,它是固定的。 因此,我们正在针对版本7.1之后推出的SafariRemoteNotification进行检查,以覆盖3.0及更高版本中的所有Safaris。
  • 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+(常绿)。
  • 闪烁:一旦Google开启Chrome 28, CSS.supports()在Blink中引入。当然,这与Opera中使用的Blink一样。
  • 成功测试:

  • Firefox 0.8 - 44
  • Chrome 1.0 - 48
  • 歌剧8.0 - 34
  • Safari 3.0 - 10
  • IE 6 - 11
  • 边缘 - 20-25
  • 2016年11月更新,包括从9.1.3及更高版本检测Safari浏览器


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

        <!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.$1);
                            alert(rv);
                        }
                    }
                    else {
                        alert('otherbrowser');
                    }
                }
                else {
                    //For < IE11
                    alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
                }
                return false;
            }}
    </script>
    
    </body>
    </html>
    

    我知道使用lib可能会矫枉过正,但为了丰富线程,您可以检查is.js的方法:

    is.firefox();
    is.ie(6);
    is.not.safari();
    
    链接地址: http://www.djcxy.com/p/23033.html

    上一篇: How to detect Safari, Chrome, IE, Firefox and Opera browser?

    下一篇: load and execute order of scripts