用户代理检测

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

以下是完整的用户代理字符串检测脚本,包括检测呈现引擎、平台、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. python基础知识二

    对象 python把在程序中用到的任何东西都成为对象. 每一个东西包括数.字符串甚至函数都是对象. 使用变量时只需要给他们赋一个值.不需要声明或定义数据类型. 逻辑行与物理行 物理行是你在编写程序时所 ...

  2. JS关闭窗口或JS关闭页面的几种代码

    //JS定时自动关闭窗口 <script language="javascript"> <!-- function closewin(){ self.opener ...

  3. 使用dojo遮罩加载进度。

    使用dojox.widget.Standby来实现类似视频缓冲加载时候转圈的效果.

  4. 基于shiro授权过程

    1.对subject进行授权,调用方法isPermitted("permission串")2.SecurityManager执行授权,通过ModularRealmAuthorize ...

  5. OC - 18.监听iPhone的网络状态

    使用系统的方法来监听网络状态 系统的方法是通过通知机制来实现网络状态的监听 实现网络状态监听的步骤 定义Reachability类型的成员变量来保存网络的状态 @property (nonatomic ...

  6. maven项目显示红叉的解决方法

    我们在做maven项目时,有时项目会显示红叉,但是项目本身并没有错误,如何去掉呢? 下面是我的解决方法 1.点击项目再右键,在搜索框中输入facets 2.把Dynamic Web Module的版本 ...

  7. ubuntu 14.04 修改PS1提示符

    默认情况下,Ubuntu终端会输出完整路径,在路径名很长的时候,提示方式很不友好,通过以下步骤修改PS1变量的设置,可以让终端输出相对路径.类似于红帽系统的风格.修改思路:将w修改为W显示绝对路径,并 ...

  8. Javascript线程及定时机制

    setTimeout.setInterval的使用 Javascript api文档中定义setTimeout和setInterval第二个参数意义分别为间隔多少毫秒后回调函数被执行和每隔多少毫秒回调 ...

  9. 求LR(0)文法的规范族集和ACTION表、GOTO表的构造算法

    原理 数据结构 // GO private static Map<Map<Integer,String>,Integer> GO = new HashMap<Map< ...

  10. jquery 中 form的使用

    纠结了一下 form 表单的提交响应事件,因为在表单中,form标签会让浏览器自动提交,而我一直写的是 $(".btn").click(function()) 提交按钮的响应事件, ...