用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 相关文章推荐
不用MOUSEMOVE也能滑动啊
May 23 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
javascript常用代码段搜集
Dec 04 Javascript
JQuery radio(单选按钮)操作方法汇总
Apr 15 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 Javascript
JS获取元素多层嵌套思路详解
May 16 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
详解vue-router 路由元信息
Sep 13 Javascript
详解webpack 入门与解析
Apr 09 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
解决vue项目使用font-awesome,build后路径的问题
Sep 01 Javascript
Vue项目history模式下微信分享爬坑总结
Mar 29 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
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
Python中的面向对象编程详解(上)
2015/04/13 Python
spyder常用快捷键(分享)
2017/07/19 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
Python中psutil的介绍与用法
2019/05/02 Python
Python 去除字符串中指定字符串
2020/03/05 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python实现简单的tcp 文件下载
2020/09/16 Python
HTML5图片预览实例分享
2014/06/04 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
C#基础面试题
2016/10/17 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
教师读书活动总结
2014/05/07 职场文书
社会学专业求职信
2014/07/17 职场文书
家长意见书
2015/06/04 职场文书
交通事故责任认定书
2015/08/06 职场文书