用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 相关文章推荐
(仅IE下有效)关于checkbox 三态
May 12 Javascript
认识延迟时间为0的setTimeout
May 16 Javascript
基于jquery的超简单上下翻
Apr 20 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
jQuery :first选择器使用介绍
Aug 09 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 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 stream_context_create()函数的使用示例
2015/05/12 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
$()JS小技巧
2007/07/21 Javascript
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python的Tqdm模块的使用
2018/01/10 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python通过socketserver处理多个链接
2020/03/18 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
体育学院毕业生自荐信
2013/11/03 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
初中作文评语集锦
2014/12/25 职场文书
中秋节随笔
2015/08/15 职场文书
高中化学教学反思
2016/02/22 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
方法汇总:Python 安装第三方库常用
2022/04/26 Python