`

JavaScript判断浏览器类型及版本「转载 WEB前端开发http://www.liutime.com/webinfo/1936/」

阅读更多

你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器。

浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本。

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。下面是判断浏览器的代码:

var Sys = {};
var ua = navigator.userAgent.toLowerCase();
if (window.ActiveXObject)
Sys.ie = ua.match(/msie ([\d.]+)/)[1]
else if (document.getBoxObjectFor)
Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1]
else if (window.MessageEvent && !document.getBoxObjectFor)
Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1]
else if (window.opera)
Sys.opera = ua.match(/opera.([\d.]+)/)[1]
else if (window.openDatabase)
Sys.safari = ua.match(/version\/([\d.]+)/)[1];

//以下进行测试
if(Sys.ie) document.write('IE: '+Sys.ie);
if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
if(Sys.opera) document.write('Opera: '+Sys.opera);
if(Sys.safari) document.write('Safari: '+Sys.safari);

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

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

var Sys = {};
var ua = navigator.userAgent.toLowerCase();
window.ActiveXObject ? Sys.ie = ua.match(/msie ([\d.]+)/)[1] :
document.getBoxObjectFor ? Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] :
window.MessageEvent && !document.getBoxObjectFor ? Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] :
window.opera ? Sys.opera = ua.match(/opera.([\d.]+)/)[1] :
window.openDatabase ? Sys.safari = ua.match(/version\/([\d.]+)/)[1] : 0;

//以下进行测试
if(Sys.ie) document.write('IE: '+Sys.ie);
if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
if(Sys.opera) document.write('Opera: '+Sys.opera);
if(Sys.safari) document.write('Safari: '+Sys.safari);

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

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

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

var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;

//以下进行测试
if (Sys.ie) document.write('IE: ' + Sys.ie);
if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
if (Sys.opera) document.write('Opera: ' + Sys.opera);
if (Sys.safari) document.write('Safari: ' + Sys.safari);

其中,采用了“… ? … : …”这样的判断表达式来精简代码。判断条件是一条赋值语句,既完成正则表达式的匹配及结果复制,又直接作为条件判断。而随后的版本信息只需从前面的匹配结果中提取即可,这是非常高效的代码。

以上的代码都是为了打造前端框架所做的预研,并在五大浏览器上测试通过。今后,判断某种浏览器只需用if(Sys.ie)或if(Sys.firefox)等形式,而判断浏览器版本只需用if(Sys.ie == ’8.0′)或if(Sys.firefox == ’3.0′)等形式,表达起来还是非常优雅的。

前端框架项目已经启动,一切就看过程和结果了。

 
分享到:
评论

相关推荐

    asp.net版个人博客系统

    一个基于asp.net开发的的个人网络日志及文章系统类型的web应用程序.支持后台管理等功能。 演示地址 : http://www.amznz.com 安装说明 1.建立WEB站点,站点根目录为CodeResource目录 2.根据书中数据库步骤,在SQL...

    asp.net-MYBOLG-YOUKNOW.zip_False Security_myblog_sln系统

    一个基于asp.net开发的的个人网络日志及文章系统类型的web应用程序.支持后台管理等功能。 安装说明 1.建立WEB站点,站点根目录为CodeResource目录 2.根据书中数据库步骤,在SQL数据库中建立数据库,使用数据脚本生成...

    西游博客系统

    西游博客是一个基于asp.net开发的的个人网络日志及文章系统类型的web应用程序.支持后台管理等功能。 <br> 演示地址 : http://www.4151.cn<br><br>安装说明 <br>1.建立WEB站点,站点根目录为Code...

    WebInfo:通过简单链接窃取用户信息的程序

    网络信息通过简单链接窃取用户信息的程序要求NodeJS 14+ 任何支持ES6的浏览器证书机器人安装确保certbot在/etc/letsencrypt/live/info.emilien.ml/下创建了必需的HTTPS文件。 :/WebInfo/src$ npm install :/WebInfo/...

    Python库 | easy-webinfo-0.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:easy-webinfo-0.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    CVE-2020-1938 Apache Tomcat 文件包含EXP

    Tomcat是Apache软件基金会中的一个重要项目,性能稳定且免费,是目前较为流行的Web应用服务器。由于Tomcat应用范围较广,因此本次通告的漏洞影响范围较大,请相关用户及时采取防护措施修复此漏洞。 参考链接: ...

    【JavaScript源代码】VUE引入使用G2图表的实现.docx

    Vue.js 是一种流行的前端框架,用于构建用户界面。在 Vue 中集成 G2 图表库可以创建丰富的数据可视化组件。G2 是 AntV 的一部分,它是一个强大的数据可视化库,提供了图形语法,支持 Canvas 和 SVG 渲染,适用于快速...

    论坛管理系统

    1.建立WEB站点,站点根目录为...在使用VS 工具打开论坛项目时,如果WEB站点链接不上,请修改SampleForum.csproj.webinfo文件中的<Web URLPath = "http://localhost/SampleForum/SampleForum.csproj" />为实际web路径。

    彬月论坛 v1.0.0(Beta1)

    使用ASP.NET(C#)编写的,采用... 解压缩后,只要正确修改 WebForum 目录中 WebForum.csproj.webinfo 文件即可在 Visual Studio.NET 环境中打开 <VisualStudioUNCWeb><br> <Web URLPath = "...

    使用php基于网页之间的链接抓取网站列表的php程序-全网抓取的php爬虫程序小试验

    域名存储表:webinfo.sql, 抓了一段时间,目前有8万来个域名吧。 除了百度外,有很多网站会自动收录网上的网站,然后查询出网站的基本信息、SEO信息,百度、GOOGLE等搜索引擎的收录量,域名whois查询结果等,而这些...

    Yiso智云搜索引擎开源PHP源码.zip

    Yiso 是一个性能极佳的搜索引擎,开源无加密,亦可做收录网址平台使用!...(打开webinfo.yiso或以文本打开,增加或添加数据内容格式,以此类推,一行一条数据) 或者是在平台直接输入域名地址一键收录提交即可

    C# 数据库 常数生成器 & WEB 项目打包工具 Ver: 1.0.1.0

    .webinfo;.scc;.suo;.vssscc;.vspscc;.csproj;.cs;.vbproj;.vb;.pdb;.db;.mdf;.ldf</SkipExt> <SourceDirectory></SourceDirectory> <TargetDirectory></TargetDirectory> </SourceHistory> </TargetHistory...

    Yiso智云搜索引擎开源PHP源码

    Yiso 是一个性能极佳的搜索引擎,免费开源,亦可做收录网址平台使用!...(打开webinfo.yiso或以文本打开,增加或添加数据内容格式,以此类推,一行一条数据) 或者是在平台直接输入域名地址一键收录提交即可

    Yiso搜索引擎开源PHP源码 无需安装数据库

    Co源码引见 Yiso 是一个性能杰出的搜索引擎,以及免费且开源的网址收录...数据存储在文件 s/database/webInfo/webinfo.yiso 中。能够翻开该文件,以文本格式编辑数据,或者直接在平台输入域名并一键提交以收录数据。

    ASP 小程序 权限 管理 数据库 等级 加密 搜索 探针

    10月8日 13:17 97985 webinfo1.rar 9月15日 22:51 33340 web管理.rar 9月16日 21:12 25478 web管理啊.rar 10月8日 13:06 76202 ym47-CnNine102.rar 10月8日 13:12 61403 ym-jmsearch.rar 9月15日 23:07 10331 ...

    Spring boot web 访问

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如数据库、日志、安全等,极大地提高了开发效率。在"Spring Boot web 访问"这个主题中...

Global site tag (gtag.js) - Google Analytics