用jQuery实现检测浏览器及版本的脚本代码


Posted in Javascript onJanuary 22, 2008

如何用 Javascript 检测浏览器似乎是老生常谈的问题。根据本人的经验,使用 Javascript 检测浏览器无非使用两大类的方法。

其一,是使用使用浏览器的功能属性。比如检测浏览器是否支持 getElementById 方法就可以使用

if (document.getElementById) {
    // the method exists, so use it here
} else {
    // do something else
}

虽然这样的检测无法得知用户具体使用哪一种浏览器,不过开发者根据浏览器的功能判断是否兼容自己的代码是经得起考验的。如果关注浏览器的实际功能而不在乎它的实际身份,就可以使用这种方法。

其二,就是使用传统的 user-agent 字符串,这可能是最古老也是最流行的检测方式。虽然从技术角度上说,用户可以更改自己的 user-agent,但是使用它的确能获得一些有用的信息。

话说到此可能有些偏题。使用过 jQuery 的朋友都知道,使用 jQuery 本身的 brower 方法就可以准确的判断用户在使用那种浏览器甚至是版本。好的开发库使用者都想了解其中的一些其实现机制,那么,jQuery 是如何做到这些的?

查看 jQuery 最新的源代码(版本 1.2.2),在第 1195 行至 1205 行,是它的判断浏览器的函数。正如你所看见的,jQuery 使用的是上述第二种方法,即使用 user-agent 判断用户的浏览器和版本。

坦白说,起先我对短短的五行代码就可以判断浏览器的种类和版本感到非常的惊奇。在《Javascript 高级程序设计》一书中,作者甚至使用单独的章节描述的如何使用 Javascript 判断浏览器和操作系统。但通过阅读其代码(其实并不难),我顿时有中恍然大悟的感觉。废话不多说,贴上代码。

var userAgent = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
jQuery.browser = {
    version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
    safari: /webkit/.test( userAgent ),
    opera: /opera/.test( userAgent ),
    msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
    mozilla: /mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)
};

说到这里,其实有经验的 Javascript 开发人员已经知道了其中的奥秘。是的,jQuery 使用的是正则判断浏览器的种类和版本。做得相当的漂亮!

首先它将 user-agent 统一成小写,然后使用正则逐步的匹配是哪种浏览器。有关正则方面相关的信息,可以参考这里。不过,有人肯定会怀疑这样的判断是否正确。那么我们先来看下下面四个主流浏览器的 user-agent:

Safari(Windows edition)

... AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9

Opera(Opera 9.2 on Windows XP)

Opera/9.24 (Windows NT 5.1; U; zh-cn)

Mozilla(Firefox 2.0.11 on Windows XP)

... Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

Internet Explorer (7.0 on Windows XP)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

jQuery 非常巧妙的使用各浏览器各自不同的 user-agent 特性作为判断。比如 Safari 中 “/webkit/” 是专有的、“/opera/” 也是只有 Opera 浏览器特有等等。这种验证方法可以在目前主流的浏览器上面,基本都可以准确判断。

就在这里打住了,jQuery 的确是非常优秀的 Javascript 开发框架之一。掌握它的确可以为自己的开发添加不少的乐趣。我会陆续将自己阅读 jQuery 框架的心得逐一的发上来,请大家关注。

Javascript 相关文章推荐
createElement动态创建HTML对象脚本代码
Nov 24 Javascript
关于JS中的闭包浅谈
Aug 23 Javascript
JavaScript设计模式之适配器模式介绍
Dec 28 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
jQuery实用技巧必备(中)
Nov 03 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
Feb 25 Javascript
javascript基本算法汇总
Mar 09 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
Dec 08 Javascript
Vue之mixin全局的用法详解
Aug 22 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 Javascript
vue 使用async写数字动态加载效果案例
Jul 18 Javascript
区分vue-router的hash和history模式
Oct 03 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 #Javascript
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 #Javascript
jquery 插件 人性化的消息显示
Jan 21 #Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 #Javascript
利用js跨页面保存变量做菜单的方法
Jan 17 #Javascript
[原创]来自ImageSee官方 JavaScript图片浏览器
Jan 16 #Javascript
JavaScript表单常用验证集合
Jan 16 #Javascript
You might like
PHP网站备份程序代码分享
2011/06/10 PHP
PHP 转义使用详解
2013/07/15 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
JS简单计算器实例
2015/01/20 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
基于python绘制科赫雪花
2018/06/22 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python数据归一化及三种方法详解
2019/08/06 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
python如何调用php文件中的函数详解
2020/12/29 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
会走路的树教学反思
2014/02/20 职场文书
团队队名口号大全
2014/06/06 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书