在网站的前端开发,浏览器兼容性问题这已经让我们抢,Chrome但也生出不知道多少麻烦,我们增加。

浏览器兼容性将由前端开发框架解决的第一个问题。要解决的兼容性问题必须首先准确推断浏览器的类型和它的版本号。 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例如以下:

<pre name="code" class="javascript">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。以下是推断浏览器的代码:

<script type="text/javascript">

        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); </script>

我们把对IE的推断放在第一,由于IE的用户最多,其次是推断Firefox。按使用者多少的顺序来推断浏览器类型,能够提高推断效率。少做无用功。

之所以将Chrome放在第三推断,是由于我们预測Chrome非常快会成为市场占有率第三的浏览器。

当中。在分析浏览器版本号时,用到了正則表達式来析取当中的版本号信息。

假设你的JavaScript玩得非常高。你还能够将前面的推断代码写成这样:





    <script type="text/javascript">

<script type="text/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);

    </script>
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);

    </script>

这样能够使JavaScript代码更精简些。

当然,可读性稍差一些。就看你是重视效率还是重视可维护性了。

使用不同特征来推断浏览器的方法,尽管在速度上比用正則表達式分析userAgent要来的快。只是这些特征可能会随浏览器版本号而变化。

比方,一种浏览器本来独有的特性取得了市场上的成功,其它浏览器也就可能跟着增加该特性,从而使该浏览器的独有特征消失。导致我们的推断失败。因此,相对照较保险的做法是通过解析userAgent中的特征来推断浏览器类型。何况,反正推断版本号信息也须要解析浏览器的userAgent的。

通过分析各类浏览器的userAgent信息,不难得出分辨各类浏览器及其版本号的正則表達式。并且,对浏览器类型的推断和版本号的推断全然能够合为一体地进行。

于是。我们能够写出以下的代码:

 <script type="text/javascript">

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

    </script>

当中,採用了“... ?

... : ...”这种推断表达式来精简代码。推断条件是一条赋值语句,既完毕正則表達式的匹配及结果复制,又直接作为条件推断。而随后的版本号信息仅仅需从前面的匹配结果中提取就可以,这是很高效的代码。





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





方法二:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script type="text/javascript">
function browserinfo(){
var Browser_Name=navigator.appName;
var Browser_Version=parseFloat(navigator.appVersion);
var Browser_Agent=navigator.userAgent;
var Actual_Version,Actual_Name;
var is_IE=(Browser_Name=="Microsoft Internet Explorer");//判读是否为ie浏览器
var is_NN=(Browser_Name=="Netscape");//推断是否为netscape浏览器
var is_op=(Browser_Name=="Opera");//推断是否为Opera浏览器
if(is_NN){
//upper 5.0 need to be process,lower 5.0 return directly
if(Browser_Version>=5.0){
if(Browser_Agent.indexOf("Netscape")!=-1){
var Split_Sign=Browser_Agent.lastIndexOf("/");
var Version=Browser_Agent.lastIndexOf(" ");
var Bname=Browser_Agent.substring(0,Split_Sign);
var Split_sign2=Bname.lastIndexOf(" ");
Actual_Version=Browser_Agent.substring(Split_Sign+1,Browser_Agent.length);
Actual_Name=Bname.substring(Split_sign2+1,Bname.length); }
if(Browser_Agent.indexOf("Firefox")!=-1){
var Split_Sign=Browser_Agent.lastIndexOf("/");
var Version=Browser_Agent.lastIndexOf(" ");
Actual_Version=Browser_Agent.substring(Split_Sign+1,Browser_Agent.length);
Actual_Name=Browser_Agent.substring(Version+1,Split_Sign); }
if(Browser_Agent.indexOf("Safari")!=-1){
if(Browser_Agent.indexOf("Chrome")!=-1){
var Split_Sign=Browser_Agent.lastIndexOf(" ");
var Version=Browser_Agent.substring(0,Split_Sign);;
var Split_Sign2=Version.lastIndexOf("/");
var Bname=Version.lastIndexOf(" ");
Actual_Version=Version.substring(Split_Sign2+1,Version.length);
Actual_Name=Version.substring(Bname+1,Split_Sign2);
}
else{
var Split_Sign=Browser_Agent.lastIndexOf("/");
var Version=Browser_Agent.substring(0,Split_Sign);;
var Split_Sign2=Version.lastIndexOf("/");
var Bname=Browser_Agent.lastIndexOf(" ");
Actual_Version=Browser_Agent.substring(Split_Sign2+1,Bname);
Actual_Name=Browser_Agent.substring(Bname+1,Split_Sign); }
} }
else{
Actual_Version=Browser_Version;
Actual_Name=Browser_Name;
}
}
else if(is_IE){
var Version_Start=Browser_Agent.indexOf("MSIE");
var Version_End=Browser_Agent.indexOf(";",Version_Start);
Actual_Version=Browser_Agent.substring(Version_Start+5,Version_End)
Actual_Name=Browser_Name; if(Browser_Agent.indexOf("Maxthon")!=-1||Browser_Agent.indexOf("MAXTHON")!=-1){
var mv=Browser_Agent.lastIndexOf(" ");
var mv1=Browser_Agent.substring(mv,Browser_Agent.length-1);
mv1="遨游版本号:"+mv1;
Actual_Name+="(Maxthon)";
Actual_Version+=mv1;
} }
else if(Browser_Agent.indexOf("Opera")!=-1){
Actual_Name="Opera";
var tempstart=Browser_Agent.indexOf("Opera");
var tempend=Browser_Agent.length;
Actual_Version=Browser_Version;
}
else{
Actual_Name="Unknown Navigator"
Actual_Version="Unknown Version"
}
/*------------------------------------------------------------------------------
--Your Can Create new properties of navigator(Acutal_Name and Actual_Version) --
--Userage: --
--1,Call This Function. --
--2,use the property Like This:navigator.Actual_Name/navigator.Actual_Version;--
------------------------------------------------------------------------------*/
navigator.Actual_Name=Actual_Name;
navigator.Actual_Version=Actual_Version; /*---------------------------------------------------------------------------
--Or Made this a Class. --
--Userage: --
--1,Create a instance of this object like this:var browser=new browserinfo;--
--2,user this instance:browser.Version/browser.Name; --
---------------------------------------------------------------------------*/
this.Name=Actual_Name;
this.Version=Actual_Version;
}
browserinfo(); document.write("你使用的浏览器是:"+navigator.userAgent);
document.write("<br>");
document.write("你使用的浏览器是:"+navigator.Actual_Name+",版本号号:"+navigator.Actual_Version); </script>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body> </body>
</html>

版权声明:本文博主原创文章,博客,未经同意不得转载。

JS浏览器类型推断方法的更多相关文章

  1. 关于通过JS识别浏览器类型的方法

    JS检测浏览器类型的方法   网络上一般采用navigator.userAgent判断浏览器标识的办法,但是有个麻烦的问题是IE11不断升级之后,IE11的userAgent变成: "Moz ...

  2. JS判断浏览器类型的方法总结(IE firefox chrome opera safari)

    JS判断浏览器类型的方法总结,可判别当前客户端所使用的浏览器是ie,firefox,safari,chrome或者是opera,另外js可以精确判断到ie浏览器的版本,依然直接上代码,需要的朋友可按照 ...

  3. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...

  4. js 浏览器上调试方法多样

    1.alert(111)       直接打印出 111 2.debugger        写在代码要调试的地方 3.直接在控制台 source 里找到要调试的代码打断点 4.console 常用的 ...

  5. js判断类型的方法

    //判断类型 var arr=[]; Object.prototype.toString.call(arr)=='[object Array]' //判断是否是包含关系 function elCont ...

  6. JS推断浏览器类型与版本号

    在JS中推断浏览器的类型,预计是每一个编辑过页面的开发者都遇到过的问题.在众多的浏览器产品中.IE.Firefox.Opera.Safari........众多品牌却标准不一,因此时常须要依据不同的浏 ...

  7. Selenium2学习-019-WebUI自动化实战实例-017-获取浏览器类型

    Web UI 自动化脚本分布执行过程中有时候需要获取浏览器的相关信息,此文给出了一个简略获取浏览器类型的方法,敬请各位小主们参阅.若有不足之处,敬请大神指正,不胜感激! 闲话少述,上码. /** * ...

  8. js中推断浏览器类型

    在实际看发展.有时候会遇到在IOS和Android中要用不同的方法处理网页.须要让网页返回当前浏览器的类型. /** * 推断浏览器类型 */ var Browse = function () { / ...

  9. [转载]jQuery 1.9 移除了 $.browser 的替代方法获取浏览器类型

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

随机推荐

  1. spring 入门篇

    spring 入门篇         相对于Hibernate(冬眠),Spring(春天),具有更多的诗意与希望的感觉,是为了解决传统J2EE开发效率过低.开发商之间不统一.没有真正实现“写一次到处 ...

  2. SMTP邮件传输协议发送邮件和附件

    在以前接触的项目中,一直都是在做网站时用到了发送mail 的功能,在asp 和.net 中都有相关的发送mail 的类, 实现起来非常简单.最近这段时间因工作需要在C++ 中使用发送mail 的功能, ...

  3. grunt api 文档

    Grunt docs Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. 安装 grunt-cli npm install grunt-cli -g 注 ...

  4. Delphi XE的RTTI增强,动态Hook某些内部事件

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下: Delphi2010 ...

  5. java selenium webdriver实战 seleniumIDE

    Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...

  6. 脑波设备mindwave二次开发框架

    神念科技提供的mindwave提供了脑波耳机和相应的游戏,这些游戏你可以通过购买神念科技的mindwave耳机来获取,这里不多作介绍. 我们作为程序员,如果有了相应的创意,也可以通过他们提供的二次开发 ...

  7. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  8. How to get the xpath by clicking an html element

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element

  9. kbengine简单介绍(1)

    什么是kbengine? 一款开源的游戏服务端引擎,客户端通过简单的约定协议就能与服务端通讯, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d-x, HTML5, 等 ...

  10. Cocos2d-x:环境配置小节

    一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...