`
裴小星
  • 浏览: 260762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8ccf5db2-0d60-335f-a337-3c30d2feabdb
Java NIO翻译
浏览量:27552
F3e939f0-dc16-3d6e-8c0b-3315c810fb91
PureJS开发过程详解
浏览量:71780
07a6d496-dc19-3c71-92cf-92edb5203cef
MongoDB Java ...
浏览量:61921
社区版块
存档分类
最新评论

jQuery.browser的实现方式

阅读更多
jQuery.browser的实现方式

jQuery中的browser对象

  jQuery中的browser对象保存了浏览器的信息。跨浏览器是大多数客户端JS库必须具备的基本特性,判断浏览的类型和版本号并保存在对象中,就是为了针对不同浏览器采取不同的策略。
  下面的代码用于展示jQuery.browser的用法:
<script type="text/javascript" src="jquery.js"></script>
<script>
document.write('$.browser.webkit: ' + $.browser.webkit + '<br />');
document.write('$.browser.opera: ' + $.browser.opera + '<br />');
document.write('$.browser.msie: ' + $.browser.msie + '<br />');
document.write('$.browser.mozilla: ' + $.browser.mozilla + '<br />');
document.write('$.browser.version: ' + $.browser.version);
</script>

  这段代码在不同浏览器中的显示效果是不同的。
  IE中的显示效果如下:
$.browser.webkit: undefined
$.browser.opera: undefined
$.browser.msie: true
$.browser.mozilla: undefined
$.browser.version: 8.0

  根据 $.browser.msie 是否为true,就可以判断浏览器是否为 IE 内核了。而通过$.browser.version可以获得浏览器内核的版本号。其他浏览器可以采用类似的方式进行判断。

实现思路

  jQuery.browser的实现思路如下:
  1. 通过 window.navigator.userAgent 获取浏览器的描述字符串
  2. 使用正则表达式进行匹配,不同浏览器内核对应正则表达式是不同的
  3. 根据匹配的结果,判断是否为特定浏览器,并提取版本号
  4. 将结果保存到browser对象中。

  首先,让我们测试一下不同浏览器的 window.navigator.userAgent 的输出结果:
ua = window.navigator.userAgent;
document.write('user agent:<br />' + ua);

  Google Chrome 的显示结果:
user agent:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.60 Safari/534.24

  我们知道Cheomr的浏览器内核是Webkit,因此其中最重要的是WebKit关键字,但Google Chrome为了显示其兼容性,也在描述字符串中包含了Mozilla等字样。其他浏览器也有类似的情况。
  Apple Safari 的显示结果:
user agent:
Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

  Microsoft IE 8.0 的显示结果:
user agent:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)

  Mozilla FireFox的显示结果:
user agent:
Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

  Opera的显示结果:
user agent:
Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.8.131 Version/11.10


  因为不同浏览器采用的正则表达式是不同的,下面,我们就针对不同的浏览器的情况,对jQuery.browser的实现进行进一步的分析。

Webkit 内核的检测

  Google Chrome 和 Apple Safari 使用的都是 Webkit 内核,其描述字符串中也都包含了"Webkit",因此用于检测的正则表达式中需要包含"Webkit"。
  另外,版本号是紧跟着"Webkit"关键字的,中间用"/"分隔。因此,我们可以用下面的代码判断浏览器是否为Webkit内核,并提取版本号:
ua = window.navigator.userAgent;
document.write('user agent:<br />' + ua + '<br /><br />');

match = /WebKit\/([\w.]+)/.exec(ua);
if (match) {
	document.write('Webkit Kernal<br />');
	document.write('Version: ' + match[1]);
} else {
	document.write('Not Webkit Kernal');
}

  使用的正则表达式是 /WebKit\/([\w.]+)/, 表示包含"Webkit"及分隔符"/",并且捕捉"/"之后的字符,直到空格为止,作为版本号。(\w匹配字母或数字或下划线或汉字等。)

IE 内核的检测

  IE 内核浏览器的描述字符串中包含了"MSIE",版本号紧跟着"MSIE"关键字,中间用空格分隔。因此,我们可以用下面的代码判断浏览器是否为IE内核,并提取版本号:
ua = window.navigator.userAgent;
document.write('user agent:<br />' + ua + '<br /><br />');

match = /MSIE ([\w.]+)/.exec(ua);
if (match) {
	document.write('IE Kernal<br />');
	document.write('Version: ' + match[1]);
} else {
	document.write('Not IE Kernal');
}

  使用的正则表达式是 /MSIE ([\w.]+)/, 表示包含"MSIE"及空格,并且捕捉空格之后的字符,直到下一个空格为止,作为版本号。

Mozilla 内核的检测

  Mozilla Firefox 描述字符串中包含了"Mozilla",版本号出现在在"rv:"之后(Mozilla关键字之后也有版本号,但rv之后的版本号更细化一些)。因此,我们可以用下面的代码判断浏览器是否为Mozilla内核,并提取版本号:
ua = window.navigator.userAgent;
document.write('user agent:<br />' + ua + '<br /><br />');

match = /Mozilla(?:.*? rv:([\w.]+))/.exec(ua);
if (match) {
	document.write('Mozilla Kernal<br />');
	document.write('Version: ' + match[1]);
} else {
	document.write('Not Mozilla Kernal');
}

  使用的正则表达式是 /Mozilla(?:.*? rv:([\w.]+))/, 表示包含"Mozilla",并且捕捉"rv:"之后的字符,直到下一个空格为止,作为版本号。


Opera 内核的检测

  Opera 描述字符串中包含了"Opera",版本号出现在在"Version/"之后(同样,Opera关键字之后也有版本号,但"Version"之后的版本号更细化一些)。因此,我们可以用下面的代码判断浏览器是否为Opera内核,并提取版本号:
ua = window.navigator.userAgent;
document.write('user agent:<br />' + ua + '<br /><br />');

match = /Opera(?:.*Version)\/([\w.]+)/.exec(ua);
if (match) {
	document.write('Opera Kernal<br />');
	document.write('Version: ' + match[1]);
} else {
	document.write('Not Opera Kernal');
}

  使用的正则表达式是 /Opera(?:.*Version)\/([\w.]+)/, 表示包含"Opera",并且捕捉"Version/"之后的字符,直到下一个空格为止,作为版本号。

合并


  将以上针对不同浏览器的代码串联起来,就可以实现jQuery.browser了。但jQuery中的实现更具有技巧性一些。下面是与jQuery中的实现比较接近的写法:
$ = function() {
    function uaMatch(ua) {
        ua = ua.toLowerCase();

        var match = rwebkit.exec(ua)
                    || ropera.exec(ua)
                    || rmsie.exec(ua)
                    || ua.indexOf("compatible") < 0 && rmozilla.exec(ua)
                    || [];

        return {
            browser : match[1] || "",
            version : match[2] || "0"
        };
    }

    var
    rwebkit = /(webkit)\/([\w.]+)/,
    ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
    rmsie = /(msie) ([\w.]+)/,
    rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,    
    browser = {},
    ua = window.navigator.userAgent,
    browserMatch = uaMatch(ua);

    if (browserMatch.browser) {
        browser[browserMatch.browser] = true;
        browser.version = browserMatch.version;
    }

    return { browser: browser }
}();

  将这个 JS 文件命名为 "jquery-browser.js",并在html中引用它:
<script type="text/javascript" src="jquery-browser.js"></script>
<script>
document.write('$.browser.webkit: ' + $.browser.webkit + '<br />');
document.write('$.browser.opera: ' + $.browser.opera + '<br />');
document.write('$.browser.msie: ' + $.browser.msie + '<br />');
document.write('$.browser.mozilla: ' + $.browser.mozilla + '<br />');
document.write('$.browser.version: ' + $.browser.version + '<br />');
</script>

  效果与直接引用jquery.js是相同的。

  让我们注意几个不同之处:
  1. userAgent被转为小写字母进行匹配,避免了大小写的影响;
  2. 判断 Mozilla 时增加了 ua.indexOf("compatible") < 0,这是为了排除一些声称兼容Mozilla的浏览器的影响(比如 IE 8.0),一些搜索引擎的爬虫也经常声称兼容Mozilla;
  3. 检测Opera 和 Mozilla 的正则表达式用"?"标明 "rv" 或 "Version" 是可有可无的,这可能是为了兼容不同的 Opera 和 Mozilla 内核浏览器(或较老的版本);
  4.match 捕捉的组有两个,第一个是浏览器内核名称,第二个是版本号,实现同时提取浏览器内核名称和版本号,减少了代码量。

  以上就是jQuery.briwser的相对完整的实现了。主要的技巧是使用 window.navigator.userAgent 获取浏览器的描述字符串,以及通过正则表达式从该字符中提取信息。
8
8
分享到:
评论
1 楼 唇角轻扬 2012-08-08  
不错,学习了~~~~~~

相关推荐

    jquery.i18n.properties和jquery.easyui.min

    js使用i18n实现页面国际化 var webLanguage = ['zh-CN', 'en']; //获取网站语言 function getWebLanguage(){ //1.cookie是否存在 if (jQuery.cookie("userLanguage")) { i18nLanguage = jQuery.cookie(...

    最新jquery.1.8.1

    通过基于grunt的新构建系统,你可以轻松实现该功能。可以移除的模块包括ajax、css、dimensions、effects和offset。更多信息可参阅README file。 2. 根据浏览器为CSS属性加前缀 某些CSS属性前带有供应商前缀,...

    浅谈jQuery为哪般去掉了浏览器检测

    要是在以前,可以很方便地调用jQuery的jQuery.browser来实现。 If(jQuery.browser.msie) alert&#40;“DIE IE!”&#41; 但这一便利在jQuery 1.9之后就不复存在了。突然觉得像失去了一个最亲密的战友,一个我一搞开发...

    基于jQuery1.9版本如何判断浏览器版本类型

    在jquery.1.9以前的版本,可以使用$.browser很轻松的判断浏览器的类型和版本,但是在1.9中和以后的版本中,$.browser已经被删除,下面就介绍一下如何实现此功能,希望能够给需要的朋友带来帮助。 一.自定义代码: $...

    最新JQuery版本1.8

    通过基于grunt的新构建系统,你可以轻松实现该功能。可以移除的模块包括ajax、css、dimensions、effects和offset。更多信息可参阅README file。 2. 根据浏览器为CSS属性加前缀 某些CSS属性前带有供应商前缀,这...

    JQUERY 浏览器判断实现函数

    建议学习jquery的朋友学习下,了解下思路。主要方法:$.browser.[‘浏览器关键字’] 代码: 代码如下: [removed] $(function() { if($.browser.msie) { $( function() { alert&#40;“this is msie”&#41;; }); } else...

    JQuery权威指南源代码

    使用jQuery选择器实现隔行变色 JavaScript代码检测页面元素 jQuery代码检测页面元素 使用jQuery基本选择器 使用jQuery层次选择器 使用jQuery基本过滤选择器 使用jQuery内容过滤选择器 使用jQuery可见性过滤...

    jQuery实现frame之间互通的方法

    本文实例讲述了jQuery实现frame之间互通的方法。分享给大家供大家参考,具体如下: 父框架: // 需要共享的方法 function veriAddData(varname,vardesc){ var name = varname; var desc = vardesc; if(name!=="...

    jquery实现图片等比例缩放以及max-width在ie中不兼容解决

    上次用原生的JavaScript实现的图片等比例缩放,max-width和max-height在ie6中不兼容问题,今天用jQuery实现了这些问题 jQuery部分代码 代码如下: [removed] $(document).ready(function(){ var maxWidth=$(“.imgBox...

    jQuery权威指南-源代码

    其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧...

    jquery-1.1.3 效率提高800%

    选择器速度提升 选择器的速度大幅度提高了,下表为jQuery1.1.2和1.1.3的选择器速度对比,提高了8倍多 Browser jQuery 1.1.2 jQuery 1.1.3 % Improvement IE 6 4890ms 661ms 740% Firefox 2 5629ms 567...

    jquery 实现返回顶部功能

    今天搞了一个回到顶部的JS JQ功能,废话不多说,有图有真相! 代码如下: (function($){  $.fn.survey=function... var ieVersion=parseInt($.browser.version)}  //建立HTML  var __feedCreat=function(){   

    基于Nodejs+Express+MongoDB+jQuery+Bootstrap搭建的电影网站

    使用gulp集成jshint对JS语法检查,加入browser-sync与nodemon,实现实时刷新及服务器的自动重启等功能。 4、网站整体功能: 网站正常访问无需管理员权限,对电影的评论及个人中心资料的修改,需要用户登录,对网站...

    jquery mobile实现拨打电话功能的几种方法

    如果需要在移动浏览器中实现拨打电话,发送email,调用sns等功能,jquery mobile提供的接口是一个好办法。 采用url链接的方式,实现在safari ios,android 浏览器,webos 浏览器,塞班浏览器,ie,operamini等主流...

    jQuery功能函数详解

    jQuery通过$.browser对象获取浏览器信息。 属性 说明 msie 如果是ie为true,否则为false mozilla 如果是mozilla相关的浏览器为true,否则为false safari 如果是Safari浏览器为true,否则为false poera 如果是...

    easyui+增强窗体 demo_ext为实例文件

    7、修复datagrid.onConfirmEdit事件默认实现bug。 8、增加treegrid.onConfirmEdit事件。 2013-8-12 更新 1、修复combobox在级联操作时,传递的swd参数值为null,而不是选中值。 2、datagrid的addEventListener ...

    利用JS解决ie6不支持max-width,max-height问题的方法

    今天遇到一个关于用js解决ie6不支持支持max-width,max-height的问题,刚开始用jQuery方法来实现,不过一直获取不到css里面的值,如 代码如下: if($.browser.msie && $.browser.version == 6.0) { var maxWidth = ...

    jquery实现的网页自动播放声音

    代码如下: [removed][removed] [removed] $(function(){ //这里参考了以下两个站点的介绍 //...$.browser.version==’8.0′){ /

    jquery判断当前浏览器的实现代码

    写了一个判断当前浏览器类型及版本的方法,只在IE 8/11 、谷歌 、360 浏览器(不完全)上测试过,需要用到jquery 核心代码: ;(function($, window, document,undefined){ if(!window.browser){ var userAgent = ...

Global site tag (gtag.js) - Google Analytics