用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 相关文章推荐
JScript中的undefined和"undefined"的区别
Mar 08 Javascript
json简单介绍
Jun 10 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
浅谈js中的this问题
Aug 31 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
详解如何在vue项目中使用lodop打印插件
Sep 27 Javascript
详解Next.js页面渲染的优化方案
Jan 27 Javascript
实用Javascript调试技巧分享(小结)
Jun 18 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
零基础学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新手上路(五)
2006/10/09 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
php实现微信发红包功能
2018/07/13 PHP
php压缩文件夹最新版
2018/07/18 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
同学聚会老师邀请函
2014/01/28 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js