用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 对象的解释
Nov 24 Javascript
利用javascript/jquery对上传文件格式过滤的方法
Jul 25 Javascript
alert中断settimeout计时功能
Jul 26 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
Feb 16 Javascript
vue一步步实现alert功能
Jul 05 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
Vue.js简易安装和快速入门(第二课)
Oct 17 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 Javascript
JS实现炫酷轮播图
Nov 15 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
js实现日历
2020/11/07 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python-接口开发入门解析
2019/08/01 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
法律专业实习鉴定
2013/12/22 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
升职感谢信
2015/01/22 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
mysql知识点整理
2021/04/05 MySQL
python 对图片进行简单的处理
2021/06/23 Python
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python
聊聊redis-dump工具安装问题
2022/01/18 Redis
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL