用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权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 Javascript
jQuery实现的多屏图像图层切换效果实例
May 07 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 Javascript
微信小程序 scroll-view的使用案例代码详解
Jun 11 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 Javascript
vue+Element-ui实现登录注册表单
Nov 17 Javascript
vue项目实现分页效果
Mar 24 Vue.js
零基础学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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
vue多次循环操作示例
2019/02/08 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
Sublime开发python程序的示例代码
2018/01/24 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
python实现归并排序算法
2018/11/22 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
基于PyTorch中view的用法说明
2021/03/03 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
物业电工岗位职责
2013/11/20 职场文书
医师定期考核实施方案
2014/05/07 职场文书
党员身份证明材料
2015/06/19 职场文书