用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 01 Javascript
js 采用delete实现继承示例代码
May 20 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
three.js实现3D影院的原理的代码分析
Dec 18 Javascript
从零开始搭建一个react项目开发
Feb 09 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
解决JS表单验证只有第一个IF起作用的问题
Dec 04 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
vue 数字翻牌器动态加载数据
Apr 20 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中单引号与双引号的区别分析
2014/08/19 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python Flask-web表单使用详解
2017/11/18 Python
python @property的用法及含义全面解析
2018/02/01 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
django 模型字段设置默认值代码
2020/07/15 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
酒店副总经理岗位职责范本
2014/02/04 职场文书
总经理人事任命书
2014/06/05 职场文书
文书工作总结(范文)
2019/07/11 职场文书