用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之对系统的toFixed()方法的修正
May 08 Javascript
JS支持带x身份证号码验证函数
Aug 10 Javascript
js 判断文件类型并控制表单提交示例代码
Nov 14 Javascript
checkbox勾选判断代码分析
Jun 11 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
noty ? jQuery通知插件全面解析
May 18 Javascript
jQuery插件pagination实现无刷新分页
May 21 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
Feb 18 Javascript
浅谈angularjs中响应回车事件
Apr 24 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python检测IP地址变化并触发事件
2018/12/26 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
python 项目目录结构设置
2020/02/14 Python
Python爬取某平台短视频的方法
2021/02/08 Python
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
大课间活动实施方案
2014/03/06 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
青春奉献演讲稿
2014/05/08 职场文书
出国英文推荐信
2014/05/10 职场文书
贷款承诺书范文
2014/05/19 职场文书
活动总结报告怎么写
2014/07/03 职场文书
大班上学期个人总结
2015/02/13 职场文书
个人承诺书格式范文
2015/04/29 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
使用Python获取字典键对应值的方法
2022/04/26 Python