用户代理检测

为了不在全局作用域中添加多余的变量,我们使用模块增强模式来封装检测脚本

以下是完整的用户代理字符串检测脚本,包括检测呈现引擎、平台、Window操作系统、移动设备和游戏系统

var client=function(){

    //呈现引擎

    var engine={

      ie:0,

      gecko:0,

      webkit:0,

      khtml:0,

      opera:0,

      //完整的版本号

      ver:null

      };

    //浏览器

    var browser={

      //主要浏览器

      ie:0,

      firefox:0,

      safari:0,

      konq:0,

      opera:0,

      chrome:0,

      //具体的版本号

      ver:null

      };

    //平台、设备和操作系统

    var system={

      win:false,

      mac:false,

      xll:false,

      //移动设备

      iphone:false,

      ipod:false,

      ipad:false,

      ios:false,

      android:false,

      nokiaN:false,

      winMobile:false,

      //游戏系统

      wii:false,

      ps:false

      };

    //检测呈现引擎和浏览器

    var ua=navigator.userAgent;

    if(window.opera){

    engine.ver=browser.ver=window.opera.version();

    engine.opera=browser.opera=parseFloat(engine.ver);

    }else if(/AppleWebKit\/(\S+)/.test(ua)){

      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)){

      engine.ver=browser.ver=RegExp["$1"];

      engine.khtml=browser.konq=parseFloat(engine.ver);

      }else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){

      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)){

      engine.ver=browser.ver=RegExp["$1"];

      engine.ie=browser.ie=parseFloat(engine.ver);

      }

      //检测浏览器

      browser.ie=engine.ie;

      browser.opera=engine.opera;

      //检测平台

      var p=navigator.platform;

      system.win=p.indexOf("Win")==0;

      system.mac=p.indexOf("mac")==0;

      system.x11=(p=="x11")||(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("iphone")>-1;

      system.ipod=ua.indexOf("ipod")>-1;

      system.ipad=ua.indexOf("ipad")>-1;

      system.nokiaN=ua.indexOf("nokiaN")>-1;

      //window mobile

      if(system.win=="CE"){

        system.winMobile=system.win;

      }else if(system.win=="Ph"){

        if(/Windows Phone OS (\d+.\d+)/.test(ua)){

          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

      };

    }();

JavaScript高级程序设计20.pdf的更多相关文章

  1. JavaScript高级程序设计4.pdf

    虽然执行环境的类型总共只有两种——全局和局部(函数),但还有其他方法延长作用域链,有些语句可以在作用域链的前端临时增加一个变量对象,执行后会被移除try-catch语句的catch块和with语句 w ...

  2. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  3. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  4. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  5. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  6. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  7. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  8. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  9. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

随机推荐

  1. Sqlserver 列转行 行转列

    sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生 ...

  2. C#当中的多线程_任务并行库(下)

    4.8 处理任务中的异常 下面这个例子讨论了任务当中抛出异常,以及任务异常的获取     class Program     {         static void Main(string[] a ...

  3. Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction policies

    Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction pol ...

  4. Sublime Text 3配置LiveReload实现实时刷新

    今天看到一款很强大的插件,LiveReload,实时刷新,也就是说写完html/css/js等不用再到浏览器里按F5啦,在Ctrl+S时浏览器会自动刷新,是不是想想都很爽... Chrome:(据说支 ...

  5. 调整ListBox控件的行间距及设置文本格式

    首先要将该控件的DrawMode属性为OwnerDrawVariable 添加DrawItem重绘事件:private void listBox1_DrawItem(object sender, Dr ...

  6. gulp 之一 安装及简单CSS,JS文件合并压缩

    最近研究了一下gulp构建工具,发现使用起来比grunt顺手一些.(个人感受),以下是grunt和gulp构建方式和原理: grunt 基于文件方式构建,会把文件先写到临时目录下,然后进行读文件,修改 ...

  7. web服务器的卸载

     在卸载这三个应用之前,咱们可以在终端通过运行“dkpg -l”来查看软件状态. 方法一:选择dpkg -P来卸载软件. 因为dpkg --remove只是删除安装的文件,但不删除配置文件.而dpkg ...

  8. HMM模型

    通过前几时断续的学习,发现自己对HMM模型的了解还只停留在皮毛,导致在学习CRF模型并将其与最大熵模型.HMM.MEMM做比较时感觉很吃力,所以又花了两天时间使劲看了遍HMM,发现了解得确实深刻了很多 ...

  9. WebApi(三)-属性路由 自定义访问路径

    启用属性路由: 1.在WebApiConfig中加入如下代码: //属性路由 config.MapHttpAttributeRoutes();

  10. Android Studio与Genymontion的安装

    需要安装的软件: VirtualBox 5.1.4 Genymotion 2.7.2 Android Studio 2.1.2 安装步骤: 使用安装版安装Android Studio 1.     执 ...