用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 相关文章推荐
javascript中的if语句使用介绍
Nov 20 Javascript
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
JS动态增删表格行的方法
Mar 03 Javascript
canvas实现图像截取功能
Feb 06 Javascript
数组Array的排序sort方法
Feb 17 Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 Javascript
vue单页缓存存在的问题及解决方案(小结)
Sep 25 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 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完整的日历类(CLASS)
2006/11/27 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
jquery 新浪网易的评论块制作
2010/07/01 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
vue实现文件上传功能
2018/08/13 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
three.js实现圆柱体
2018/12/30 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
护士检查书
2014/01/17 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
教师读书活动总结
2014/05/07 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
档案接收函格式
2015/01/30 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
医者仁心观后感
2015/06/17 职场文书
初三数学教学反思
2016/02/17 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书