从别人处拷贝,只用于自己学习之用。参考源自:http://www.cnblogs.com/leadzen/archive/2008/09/06/1285764.html

JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览器 类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下,值判断出浏览器类 型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。

我们先来分析一下各种浏览器的特征及其userAgent。

IE

只有IE支持创建ActiveX控件,因此她有一个其他浏览器没有的东西,就是ActiveXObject函数。只要判断window对象存在 ActiveXObject函数,就可以明确判断出当前浏览器是IE。而IE各个版本典型的userAgent如下:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
        Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
        Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
        Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)

其中,版本号是MSIE之后的数字。

Firefox

Firefox中的DOM元素都有一个getBoxObjectFor函数,用来获取该DOM元素的位置和大小(IE对应的中是
getBoundingClientRect函数)。这是Firefox独有的,判断它即可知道是当前浏览器是Firefox。Firefox几个版本的
userAgent大致如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
        Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
        Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12
      其中,版本号是Firefox之后的数字。

Opera

Opera提供了专门的浏览器标志,就是window.opera属性。Opera典型的userAgent如下:

Opera/9.27 (Windows NT 5.2; U; zh-cn)
        Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
        Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0

其中,版本号是靠近Opera的数字。

Safari

Safari浏览器中有一个其他浏览器没有的openDatabase函数,可做为判断Safari的标志。Safari典型的userAgent如下:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
        Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3

其版本号是Version之后的数字。

Chrome

Chrome有一个MessageEvent函数,但Firefox也有。不过,好在Chrome并没有Firefox的getBoxObjectFor
函数,根据这个条件还是可以准确判断出Chrome浏览器的。目前,Chrome的userAgent是:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

其中,版本号在Chrome只后的数字。

有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧。

只要了解了以上信息,我们就可以根基这些特征来判断浏览器类型及其版本了。我们会将判断的结果保存在Sys名字空间中,成为前端框架的基本标志信息,供今
后的程序来读取。如果判断出谋种浏览器,Sys名字空间将有一个该浏览器名称的属性,其值为该浏览器的版本号。例如,如果判断出IE
7.0,则Sys.ie的值为7.0;如果判断出Firefox 3.0,则Sys.firefox的值为3.0。下面是判断浏览器的代码:

  1. <script type="text/javascript">
  2. var Sys = {};
  3. var ua = navigator.userAgent.toLowerCase();
  4. if (window.ActiveXObject)
  5. Sys.ie = ua.match(/msie ([\d.]+)/)[]
  6. else if (document.getBoxObjectFor)
  7. Sys.firefox = ua.match(/firefox\/([\d.]+)/)[]
  8. else if (window.MessageEvent && !document.getBoxObjectFor)
  9. Sys.chrome = ua.match(/chrome\/([\d.]+)/)[]
  10. else if (window.opera)
  11. Sys.opera = ua.match(/opera.([\d.]+)/)[]
  12. else if (window.openDatabase)
  13. Sys.safari = ua.match(/version\/([\d.]+)/)[];
  14.  
  15. //以下进行测试
  16. if(Sys.ie) document.write('IE: '+Sys.ie);
  17. if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
  18. if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
  19. if(Sys.opera) document.write('Opera: '+Sys.opera);
  20. if(Sys.safari) document.write('Safari: '+Sys.safari);
  21.  
  22. </script>

我们把对IE的判断放在第一,因为IE的用户最多,其次是判断Firefox。按使用者多少的顺序来判断浏览器类型,可以提高判断效率,少做无用功。之所 以将Chrome放在第三判断,是因为我们预测Chrome很快会成为市场占有率第三的浏览器。其中,在分析浏览器版本时,用到了正则表达式来析取其中的 版本信息。

如果你的JavaScript玩得很高,你还可以将前面的判断代码写成这样:

  1. <script type="text/javascript">
  2.  
  3. var Sys = {};
  4.  
  5. var ua = navigator.userAgent.toLowerCase();
  6.  
  7. window.ActiveXObject ? Sys.ie = ua.match(/msie ([\d.]+)/)[1] :
  8.  
  9. document.getBoxObjectFor ? Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] :
  10.  
  11. window.MessageEvent && !document.getBoxObjectFor ? Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] :
  12.  
  13. window.opera ? Sys.opera = ua.match(/opera.([\d.]+)/)[1] :
  14.  
  15. window.openDatabase ? Sys.safari = ua.match(/version\/([\d.]+)/)[1] : 0;
  16.  
  17. //以下进行测试
  18.  
  19. if(Sys.ie) document.write('IE: '+Sys.ie);
  20.  
  21. if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
  22.  
  23. if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
  24.  
  25. if(Sys.opera) document.write('Opera: '+Sys.opera);
  26.  
  27. if(Sys.safari) document.write('Safari: '+Sys.safari);
  28.  
  29. </script>

样可以使JavaScript代码更精简些。当然,可读性稍差一些,就看你是重视效率还是重视可维护性了。

使用不同特征来判断浏览器的方法,虽然在速度上比用正则表达式分析userAgent要来的快,不过这些特征可能会随浏览器版本而变化。比如,一种浏览器
本来独有的特性取得了市场上的成功,其他浏览器也就可能跟着加入该特性,从而使该浏览器的独有特征消失,导致我们的判断失败。因此,相对比较保险的做法是
通过解析userAgent中的特征来判断浏览器类型。何况,反正判断版本信息也需要解析浏览器的userAgent的。

通过分析各类浏览器的userAgent信息,不难得出分辨各类浏览器及其版本的正则表达式。而且,对浏览器类型的判断和版本的判断完全可以合为一体地进行。于是,我们可以写出下面的代码:

  1. 复制代码
  2. <script type="text/javascript">
  3. var Sys = {};
  4. var ua = navigator.userAgent.toLowerCase();
  5. var s;
  6. (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
  7. (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
  8. (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
  9. (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
  10. (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
  11.  
  12. //以下进行测试
  13. if (Sys.ie) document.write('IE: ' + Sys.ie);
  14. if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
  15. if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
  16. if (Sys.opera) document.write('Opera: ' + Sys.opera);
  17. if (Sys.safari) document.write('Safari: ' + Sys.safari);
  18. </script>

通过JavaScript判断当前浏览器版本的更多相关文章

  1. javascript判断手机浏览器版本信息

    <script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser={ versions:functio ...

  2. 这是一个用于判断IE浏览器版本的紧凑脚本

    这是一个用于判断IE浏览器版本的紧凑脚本IE浏览器,不管它们是什么版本,总是与Web标准有些不兼容.对于编码人员来说,这很困难.为了考虑IE的兼容性,不管它是写CSS还是写JS,IE通常都会被特殊处理 ...

  3. javascript 判断微信浏览器

    原文:javascript 判断微信浏览器 用js判断当前环境是否是是微信内置浏览器有两个方法: 1.判断useragent 2.判断是否支持微信内置浏览器才支持的一些方法,比如WeixinJSBri ...

  4. 判断IE浏览器版本

    //判断IE浏览器版本 function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isI ...

  5. 判断IE浏览器版本的精简脚本

    IE浏览器不管是什么版本,总是跟Web标准有些不太兼容.对于代码工作者来说,自然是苦不堪言,为了考虑IE的兼容问题,不管是写 CSS 还是 JS,往往都要对 IE 特别对待,这就少不了做些判断.本文不 ...

  6. JavaScript判断各浏览器CSS前缀的两种方式

    不管浏览器更新的多快,号称多么支持标准.厂商不同,他们之间还是有很多差异.我们需要区分出这些差异,针对不同的浏览器做不同的处理. 比如 CSS 前缀,IE 的是 "-ms-",旧版 ...

  7. js判断IE浏览器版本

    if(navigator.userAgent.indexOf("MSIE")>0){ if(navigator.userAgent.indexOf("MSIE 6. ...

  8. Javascript判断Chrome浏览器

    今天分享一下如何通过Javascript来判断Chrome浏览器,这里是通过userAgent判断的,检测一下userAgent返回的字符串里面是否包含“Chrome”, 具体怎么检测是通过index ...

  9. JavaScript判断IE各版本最完美解决方案

    https://github.com/nioteam/jquery-plugins/issues/12 jQuery在1.9版本之前,提供了一个浏览器对象检测的属性$.browser,使用率极高.但是 ...

随机推荐

  1. wecenter—开启CURL扩展,让服务器支持PHP curl函数(远程采集)

    curl().file_get_contents().snoopy.class.php这三个远程页面抓取或采集中用到的工具, 默迹还是侵向于用snoopy.class.php,因为他效率比较高且不需要 ...

  2. 与《YII框架》不得不说的故事—5篇目录

    与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 ( ...

  3. hdu 4493 Tutor

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4493 给你十二个月的工资,算平均数,保留两位,去除末尾的0 使用暴力解决,嘻嘻,但是这题主要是在进位这个地 ...

  4. RedisTemplate.htm

    http://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTe ...

  5. VS2010/MFC常用控件:图片控件Picture Control

    图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...

  6. openStack centos6.4

    http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-6/repodata/repomd.xml: [Errno ...

  7. Java图形化界面设计——布局管理器之FlowLayout(流式布局)

    一.布局管理器所属类包 所属类包 布局管理器名称 说明 Java.awt FlowLayout(流式布局) 组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列 Bord ...

  8. fastDFS同步问题讨论

    一.文件同步延迟问题 前面也讲过fastDFS同组内storage server数据是同步的, Storage server中由专门的线程根据binlog进行文件同步.为了最大程度地避免相互影响以及出 ...

  9. setImageResource与setImageBitmap的区别

    同样的布局文件,小分辨率手机: 1.使用setImageBitmap设置时,出现如下现象:  2.使用setImageResource时,图片显示正常 原因: setImageResource(id) ...

  10. CSS文字样式

    font-family:通常文章的正文使用的是易读性较强的serif字体,用户长时间阅读下不easy疲劳.而标题和表格则採用较醒目的sans-serif字体.Web设计及浏览器设置中也推荐遵循此原则. ...