JavaScript の 客户端检测

[博文]模块增强模式进行客户端检测

标签: 博文

常用的检测方式为:

  • [ ] 1 . 能力检测
  • [ ] 2 . 用户代理检测

这里有 2 用户代理检测

检测插件 P211

非IE浏览器: 
navigator.plugins是一个包含浏览器插件的数组, 这个数组的每一项都包含:
    name : 插件的名字.
    description: 插件的描述
    filename: 插件的文件名
    length: 插件所处理的MIME类型数量

        // 检测插件(在IE中无效):
        function hasPlugin(name){
            name = name.toLowerCase(); //toLowerCase() 方法用于把字符串转换为小写
            for(var i=0;i<navigator.plugins.length; i++){
                if(navigator.plugins[i].name.toLowerCase().indexOf(name)>-1){ // >-1表示找到
                    return true
                }
            }
            return false;
        };
            
        // 检测Flash
        alert(hasPlugin("Flash"));
        
        // 检测QuickTime
        alert(hasPlugin("QuickTime"));
            

IE浏览器
        // 检测IE的插件
        //  ========== 
        //  = IE以COM对象的方式实现插件,而COM对象使用唯一标示符来标识,因此要检测插件必须知道其 = 
        //  = COM标识符,例如,Flash的标识符是ShockwaveFlash.ShockwaveFlash = 
        //  ========== 
        function hasIEPlugin(name){
            try{
                new ActiveXOBject(name);
                return true;
            }catch(e){
                return false;
                //TODO handle the exception
            }
        };
        
        // IE中检测Flash
        alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"));


在所有浏览器中检测
        // 结合之前的2个检测函数,检测所有的浏览器中的FLash
        function hasFLash(){
            var result = hasPlugin("Flash");
            if(!result){
                result.hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
            }
            return result; // true or false
        };
        
        function hasQuickTime(){
            var result = hasPlugin("QuickTime");
            if (!result) {
                result = hasIEPlugin("QuickTime.Quicktime");
            } 
            return result;
        };

检测浏览器引擎 :


            var client = function (){
                var engine = {
                    // 呈现引擎
                    ie:0, // IE浏览器内核
                    gecko:0, // Firefox浏览器内核    
                    webkit:0, // google->chrome和apple->safari内核
                    khtml:0, // Konqueror(linux平台中的一个浏览器)的内核->KHTML
                    opera:0, // Opera
                    
                    // 具体的版本号
                    ver : null
                };
                
                // 检测呈现引擎, 平台, 设备
                return {
                    engine : engine
                };
            }();
            
            
            //  ====================== 
            //  = 检测客户端=>识别呈现引擎 = 
            //  ======================
            var ua = navigator.userAgent;
            console.log(ua);
            //  = 第一步先检测Opera = 
            if(window.opera){ // 如果是Opera浏览器, 则获得浏览器版本
                client.ver = window.opera.version(); // window.opera在Opera 5.0及更高版本中存在,在Opera 7.6及更高版本中,调用version()方法可以放回一个表示浏览器版本的字符串
                client.opera = parseFloat(client.ver);
            }else if(/AppleWebKit\/(\S+)/.test(ua)){
                //  = 第二步检测Webkit = 
                // webkit的用户代理字符串中的"AppleWebkit"是独一无二的, 所以检测这个字符串
                // \S : 表示非空格的特殊字符
                client.ver = RegExp["$1"];
                client.webkit = parseFloat(client.ver);
            }else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){
                //  = 第三步检测KHTML = 
                // 在Konqueror 3.1及更早版本中不包括KHTML的版本, 故而使用Konqueror的版本来代替
                client.ver = RegExp["$1"];
                client.khtml = parseFloat(client.ver)                
            }else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){
                //  = 第四步检测Gecko = 
                // "Gecko" 会出现在字符串"rv:"之后 ;字符串"rv:"在前面;
                client.ver = RegExp["$1"];
                client.khtml = parseFloat(client.ver)
            }else if(/MSIE ([^;]+)/.test(ua)){
                //  = 第五步检测IE = 
                client.ver = RegExp["$1"];
                client.ie = parseFloat(client.ver)
            }
            
            
            // 执行代码
            if(client.ie){ // 如果是IE呈现引擎, client.ie应该大于0
                // 针对IE的代码
                alert("我是IE ie引擎");
            }else if (client.gecko > 1.5){ // 如果是gecko呈现引擎(firefox)
                if(client.ver == "1.8.1"){
                    // 针对这版本进行操作                    
                }
                alert("我是firefox gecko引擎");
            }else if(client.webkit){
                alert("我是chrome webkie引擎");
            }else if(client.khtml){
                alert("我是KHTML 引擎");
            }else if(client.opera){
                alert("我是opera引擎");
            }


检测浏览器品牌 :

            var client = function (){
                var engine = {
                    // 呈现引擎
                    ie:0, // IE浏览器内核
                    gecko:0, // Firefox浏览器内核    
                    webkit:0, // google->chrome和apple->safari内核
                    khtml:0, // Konqueror(linux平台中的一个浏览器)的内核->KHTML
                    opera:0, // Opera
                    
                    // 具体的版本号
                    ver : null
                };
                
                var browser = {
                    //浏览器
                    ie : 0,
                    firefox:0,
                    safari:0,
                    honq:0,
                    opera:0, 
                    chrome:0,
                    
                    // 具体的版本号
                    ver : null
                };
                
                
                // 检测呈现引擎, 平台, 设备
                return {
                    engine : engine,
                    browser : browser
                };
            }();
            
            
            //  ====================== 
            //  = 检测客户端=>识别呈现引擎 = 
            //  = 检测客户端=>识别浏览器 =  
            //  ====================== 
            var ua = navigator.userAgent; 
            //  = 第一步先检测Opera =  
            var o = window.opera || window.opr
            console.log(ua);
            if(o){ // 如果是Opera浏览器, 则获得浏览器版本
                client.engine.ver = client.browser.ver = (/OPR\/(.*)/.exec(ua))[1]; // window.opera在Opera 5.0及更高版本中存在,在Opera 7.6及更高版本中,调用version()方法可以放回一个表示浏览器版本的字符串
                client.engine.opera = client.browser.opera = parseFloat(client.engine.ver);
            }else if(/AppleWebKit\/(\S+)/.test(ua)){
                //  = 第二步检测Webkit = 
                // webkit的用户代理字符串中的"AppleWebkit"是独一无二的, 所以检测这个字符串
                // \S : 表示非空格的字符
                client.engine.ver = RegExp["$1"];
                client.engine.webkit = parseFloat(client.engine.ver);

                //确定是Chrome 还是 Safari
                if(/Chrome\/(\S+)/.test(ua)){
                    client.browser.ver  = RegExp["$1"];
                    client.browser.chrome = parseFloat(client.browser.ver);
                }else if(/Version\/(\S+)/.test(ua)){
                    client.browser.ver  = RegExp["$1"];
                    client.browser.safari = parseFloat(client.browser.ver);
                }else{
                    //近似的确定版本号
                    var safariVersion = 1;
                    if(client.webkit < 100){
                        safariVersion = 1;
                    }else if(client.webkit < 312){
                        safariVersion = 1.2;
                    }else if(client.webkit < 412){
                        safariVersion = 1.3;
                    }else{
                        safariVersion = 2;
                    }
                    client.browser.safari = client.browser.ver = safariVersion;
                }
            }else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){
                //  = 第三步检测KHTML = 
                // 在Konqueror 3.1及更早版本中不包括KHTML的版本, 故而使用Konqueror的版本来代替
                client.engine.ver = client.browser.ver = RegExp["$1"];
                client.engine.khtml = client.browser.konq = parseFloat(client.engine.ver)
            }else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){
                //  = 第四步检测Gecko = 
                // "Gecko" 会出现在字符串"rv:"之后 ;字符串"rv:"在前面;
                client.engine.ver = RegExp["$1"];
                client.engine.gecko = parseFloat(client.engine.ver);
                
                //确定是不是firefox
                if(/Firefox\/(\S+)/.test(ua)){
                    client.browser.ver = RegExp["$1"];
                    client.browser.firefox = parseFloat(client.browser.ver);
                }
            }else if(/MSIE ([^;]+)/.test(ua)){
                //  = 第五步检测IE = 
                client.engine.ver = client.browser.ver = RegExp["$1"];
                client.engine.ie = client.browser.ie = parseFloat(client.engine.ver)
            }
            
            
            // 检测引擎逻辑代码
            if(client.engine.ie){ // 如果是IE呈现引擎, client.engine.ie应该大于0
                // 针对IE的代码
                alert("我是IE ie引擎");
            }else if (client.engine.gecko > 1.5){ // 如果是gecko呈现引擎(firefox)
                if(client.engine.ver == "1.8.1"){
                    // 针对这版本进行操作                    
                }
                alert("我是firefox gecko引擎");
            }else if(client.engine.webkit){
                alert("我是webkie引擎");
            }else if(client.engine.khtml){
                alert("我是KHTML 引擎");
            }else if(client.engine.opera){
                alert("我是opera引擎");
            }
            
            // 检测浏览器逻辑代码
            if(client.engine.webkit){ // 如果为webkit引擎
                if(client.browser.chrome){
                    alert("我是google chrome")
                }else if(client.browser.safari){
                    alert("我是Safari")
                }
            }else if(client.engine.gecko){
                if(client.browser.firefox){
                    alert("我是火狐")
                }else{
                    alert("gecko.....")
                }
            }else if(client.browser.ie){
                alert("我是IE")
            }else if(client.browser.opera){
                alert("我是Opera")
            }
            

用户代理检测 总结(上面的代码并入)

  • 这种方法对用户代理字符串有很大的依赖性, 不推荐
            // 模块增强模式进行客户端检测
            var client = function() {
                var engine = {
                    // 呈现引擎
                    ie: 0, // IE浏览器内核
                    gecko: 0, // Firefox浏览器内核    
                    webkit: 0, // google->chrome和apple->safari内核
                    khtml: 0, // Konqueror(linux平台中的一个浏览器)的内核->KHTML
                    opera: 0, // Opera

                    // 具体的版本号
                    ver: null
                };

                var browser = {
                    // 浏览器
                    ie: 0,
                    firefox: 0,
                    safari: 0,
                    konq: 0,
                    opera: 0,
                    chrome: 0,

                    // 具体的版本号
                    ver: null
                };

                var system = {
                    // 平台, 设备和操作系统
                    win: false,
                    mac: false,
                    x11: false, // 数字1

                    // 移动设备
                    iphone: false,
                    ipod: false,
                    ipad: false,
                    ios: false,
                    android: false,
                    nokiaN: false, // 诺基亚N系列
                    winMobile: false, // window phone系列

                    // 游戏系统
                    wii: false, // 任天堂
                    ps: false
                }

                // 检测呈现引擎和浏览器
                var ua = navigator.userAgent;
                //  = 第一步先检测Opera =  
                var o = window.opera || window.opr;
                if(o) { // 如果是Opera浏览器, 则获得浏览器版本
                    engine.ver = browser.ver = (/OPR\/(.*)/.exec(ua))[1]; // window.opera在Opera 5.0及更高版本中存在,在Opera 7.6及更高版本中,调用version()方法可以放回一个表示浏览器版本的字符串
                    engine.opera = browser.opera = parseFloat(engine.ver);
                } else if(/AppleWebKit\/(\S+)/.test(ua)) {
                    //  = 第二步检测Webkit = 
                    // webkit的用户代理字符串中的"AppleWebkit"是独一无二的, 所以检测这个字符串
                    // \S : 表示非空格的字符
                    engine.ver = RegExp["$1"];
                    engine.webkit = parseFloat(engine.ver);

                    //确定是Chrome 还是 Safari
                    if(/Chrome\/(\S+)/.test(ua)) {
                        browser.ver = RegExp["$1"];
                        browser.chrome = parseFloat(browser.ver);
                    } else if(/Version\/(\S+)/.test(ua)) {
                        browser.ver = RegExp["$1"];
                        browser.safari = parseFloat(browser.ver);
                    } else {
                        //近似的确定版本号
                        var safariVersion = 1;
                        if(engine.webkit < 100) {
                            safariVersion = 1;
                        } else if(engine.webkit < 312) {
                            safariVersion = 1.2;
                        } else if(engine.webkit < 412) {
                            safariVersion = 1.3;
                        } else {
                            safariVersion = 2;
                        }
                        browser.safari = browser.ver = safariVersion;
                    }
                } else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
                    //  = 第三步检测KHTML = 
                    // 在Konqueror 3.1及更早版本中不包括KHTML的版本, 故而使用Konqueror的版本来代替
                    engine.ver = browser.ver = RegExp["$1"];
                    engine.khtml = browser.konq = parseFloat(engine.ver)
                } else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
                    //  = 第四步检测Gecko = 
                    // "Gecko" 会出现在字符串"rv:"之后 ;字符串"rv:"在前面;
                    engine.ver = RegExp["$1"];
                    engine.gecko = parseFloat(engine.ver);

                    //确定是不是firefox
                    if(/Firefox\/(\S+)/.test(ua)) {
                        browser.ver = RegExp["$1"];
                        browser.firefox = parseFloat(browser.ver);
                    }
                } else if(/MSIE ([^;]+)/.test(ua)) {
                    //  = 第五步检测IE = 
                    engine.ver = browser.ver = RegExp["$1"];
                    engine.ie = browser.ie = parseFloat(engine.ver)
                }

                // 检测平台
                var p = navigator.platform; // 可能出现的值:Win32, Win64, MacPPC, MacIntel, X11, Linux i686;
                // 检测前缀, 向前兼容
                system.win = p.indexOf("Win") == 0;
                system.mac = p.indexOf("Mac") == 0;
                system.x11 = (p.indexOf("X11") == 0) || (p.indexOf("Linux") == 0);

                // 检测Windows 操作系统
                if(system.win) {
                    if(/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
                        if(RegExp["$1"] == "NT") {
                            switch(RegExp["$2"]) {
                                case "5.0":
                                    system.win = "2000";
                                    break;
                                case "5.1":
                                    system.win = "Xp";
                                    break;
                                case "6.0":
                                    system.win = "Vista";
                                    break;
                                case "6.1":
                                    system.win = "7";
                                    break;
                                default:
                                    system.win = "NT";
                                    break;
                            }
                        } else if(RegExp["$1"] == "9x") {
                            system.win = "ME";
                        } else {
                            system.win = RegExp["$1"];
                        }
                    }
                }
                
                // 检测移动设备
                system.iphone = ua.indexOf("iPone") > -1;
                system.ipod = ua.indexOf("iPod") > -1;
                system.ipad = ua.indexOf("iPad") > -1;
                system.nokiaN = ua.indexOf("NokiaN") > -1;
                // windows mobile设备, 又称windows CE
                if(system.win == "CE"){ // 老版本的windows Mobile
                    system.winMobile = system.win;
                }else if(system.win == "Ph"){
                    if(/Window Phone OS (\d+.\d+)/.test(ua)){ // windows phone7或更新
                        system.win = "Phone";
                        system.winMobile = parseFloat(RegExp["$1"]);
                    }
                }
                // 检测IOS版本
                if(system.mac && ua.indexOf("Mobile") > -1){
                    if(/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){
                        system.ios = parseFloat(RegExp.$1.replace("_", "."));
                    }else{
                        system.ios = 2; // 无法检测, 推测为低版本
                    }
                }
                // 检测Android 版本
                if(/Android (\d+\.\d+)/.test(ua)){
                    system.android = parseFloat(RegExp.$1);                    
                }
                
                // 检测游戏系统
                system.wii = ua.indexOf("Wii") > -1;
                system.ps = /playstation/i.test(ua);

                // 返回呈现引擎, 平台, 设备
                return {
                    engine: engine,
                    browser: browser,
                    system: system
                };
            }();
  • [ ] 接上步操作 ↑ 检测:

            // 检测引擎逻辑代码
            if(client.engine.ie) { // 如果是IE呈现引擎, engine.ie应该大于0
                // 针对IE的代码
                alert("我是IE ie引擎");
            } else if(client.engine.gecko > 1.5) { // 如果是gecko呈现引擎(firefox)
                if(client.engine.ver == "1.8.1") {
                    // 针对这版本进行操作                    
                }
                alert("我是firefox gecko引擎");
            } else if(client.engine.webkit) {
                alert("我是webkie引擎");
            } else if(client.engine.khtml) {
                alert("我是KHTML 引擎");
            } else if(client.engine.opera) {
                alert("我是opera引擎");
            }

            // 检测浏览器品牌逻辑代码
            if(client.engine.webkit) { // 如果为webkit引擎
                if(client.browser.chrome) {
                    alert("我是google chrome")
                } else if(client.browser.safari) {
                    alert("我是Safari")
                }
            } else if(client.engine.gecko) {
                if(client.browser.firefox) {
                    alert("我是火狐")
                } else {
                    alert("gecko.....")
                }
            } else if(client.browser.ie) {
                alert("我是IE")
            } else if(client.browser.opera) {
                alert("我是Opera")
            }

            // 检测平台逻辑代码
            if(client.system.win) {
                alert("window 平台")
            } else if(client.system.mac) {
                alert("Mac 平台")
            } else if(client.system.x11) {
                alert("Unix(Linux) 平台")
            }
            

网上检测方法:

var browser = {
    v: (function() {
        var u = navigator.userAgent,
            app = navigator.appVersion,
            p = navigator.platform;
        return {
            trident: u.indexOf('Trident') > -1, //IE内核
            presto: u.indexOf('Presto') > -1, //opera内核
            webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
            gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
            mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
            ios: !!u.match(/i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
            android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器
            iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器
            iPad: u.indexOf('iPad') > -1, //是否iPad
            weixin: u.indexOf('MicroMessenger') > -1, //是否微信
            webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
            UCB: u.match(/UCBrowser/i) == "UCBrowser",
            QQB: u.match(/MQQBrowser/i) == "MQQBrowser",
            win: p.indexOf('Win') > -1, //判断是否是WIN操作系统
            mac: p.indexOf('Mac') > -1 //判断是否是Mac操作系统
        };
    })()
}
        
if("\v"=="v"){//true为IE浏览器,感兴趣的同学可以去搜下,据说是现有最流行的判断浏览器的方法
    // ...
}

如果喜欢, 应该: 点赞 $underline{或者}$ …

如果有 新的想法 可以直接在下方评论或者 联系我

作者 [@Qing]

    原文作者:Adolph
    原文地址: https://segmentfault.com/a/1190000010047071
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞