用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 相关文章推荐
js截取字符串的两种方法及区别详解
Nov 05 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
Nov 20 Javascript
JavaScript处理解析JSON数据过程详解
Sep 11 Javascript
返回函数的JavaScript函数
Jun 14 Javascript
使用plupload自定义参数实现多文件上传
Jul 19 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
基于angular2 的 http服务封装的实例代码
Jun 29 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 Javascript
vue实现户籍管理系统
May 29 Javascript
如何使JavaScript休眠或等待
Apr 27 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 彩色文字实现代码
2009/06/29 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python检测服务器端口代码实例
2019/08/31 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
大学毕业生自我鉴定
2013/11/05 职场文书
七一讲话心得体会
2014/09/05 职场文书
法定代表人身份证明书
2015/06/18 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书