客户端检测一共分为三种,分别为:能力检测、怪癖检测和用户代理检测,通过这三种检测方案,我们可以充分的了解当前浏览器所处系统、所支持的语法、所具有的特殊性能。

一、能力检测:

  能力检测又称作为特性检测,检测的目标不是识别特定的浏览器,而是识别浏览器的能力。

  能力检测不必估计特定的浏览器,只需要确定当前的浏览器是否支持特定的能力,就可以给出可行的解决方案。

    var width = window.innerWidth;     //如果是非 IE 浏览器

    if (typeof width != 'number') {   //如果是 IE,就使用 document
if (document.compatMode == 'CSS1Compat') {
width = document.documentElement.clientWidth;
} else {
width = document.body.clientWidth; //非标准模式使用 body
}
}
alert(width);

  上面其实有两块地方使用了能力检测,第一个就是是否支持 innerWidth 的检测,第二个就是是否是标准模式的检测,这两个都是能力检测。

二、怪癖检测(bug 检测):

  与能力检测类似,怪癖检测的目标是识别浏览器的特殊行为。

    但与能力检测确认浏览器支持什么能力不同,怪癖检测是想要知道浏览器存在什么缺陷(bug)。

    bug 一般属于个别浏览器独有,在大多数新版本的浏览器被修复。

    var box = {
toString : function () {} //创建一个 toString(),和原型中重名了
};
for (var o in box) {
alert(o); //IE 浏览器的一个 bug,不识别了
}

三、用户代理检测

  通过检测用户代理字符串来确定实际使用的浏览器。

    在每一次 HTTP 请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过 JavaScript 的navigator.userAgent 属性访问。

    用户代理代理检测,主要通过 navigator.userAgent 来获取用户代理字符串的,通过这组字符串,我们来获取当前浏览器的版本号、浏览器名称、系统名称。

    PS:在服务器端,通过检测用户代理字符串确定用户使用的浏览器是一种比较广为接受的做法。

    但在客户端,这种测试被当作是一种万不得已的做法,且饱受争议,其优先级排在能力检测或怪癖检测之后。饱受争议的原因,是因为它具有一定的欺骗性。

document.write(navigator.userAgent); //得到用户代理字符串

  Firefox14.0.1:Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1  

  Firefox3.6.28:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28  

  Chrome20.0.1132.57 m:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11

  Safari5.1.7:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2  

  IE7.0:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

  IE8.0:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

  IE6.0:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
  Opera12.0:Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.10.289 Version/12.00
  Opera7.54:Opera/7.54 (Windows NT 5.1; U) [en]Opera8
  Opera/8.0: (Window NT 5.1; U; en)

  Konqueror(Linux 集成,基于 KHTML 呈现引擎的浏览器):Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko)

   这些字符串包含了浏览器的名称、版本和所宿主的操作系统。

 

  每个浏览器有它自己的呈现引擎:所谓呈现引擎,就是用来排版网页和解释浏览器的引擎。通过代理字符串发现,我们归纳出浏览器对应的引擎:

    IE -- Trident, IE8 体现出来了,IE6和IE7的未体现
    Firefox -- Gecko,
    Opera -- Presto, 旧版本根本无法体现呈现引擎
    Chrome -- WebKit WebKit 是 KHTML 呈现引擎的一个分支,后独立开来
    Safari -- WebKit
    Konqueror -- KHTML

  由上面的情况,我们需要检测呈现引擎可以分为五大类:IE、Gecko、WebKit、KHTML和 Opera。

  首先初始化五大类的引擎,分别给予 false 的初值,并且设置版本号为 0

var client = function () {                 //创建一个对象,自我执行
var engine = { //呈现引擎
ie : false,
gecko : false,
webkit : false,
khtml : false,
opera : false,
ver : 0 //具体的版本号
};
return {
engine : engine //返回呈现引擎对象
};
}();
alert(client.engine.ie); //获取 ie

  开始检测浏览器的引擎:

var client = function () {                 //创建一个对象,自我执行
var engine = { //呈现引擎
ie : false,
gecko : false,
webkit : false,
khtml : false,
opera : false,
ver : 0 //具体的版本号
};
//核心检测区
var ua = navigator.userAgent; if (window.opera) { //判断 opera 浏览器
engine.opera = true; //设置真,表示确认是opera引擎
engine.ver = window.opera.version(); //获取 opera 呈现引擎版本
}else if (/AppleWebKit\/(\S+)/.test(ua)) { //正则 WebKit
engine.webkit = true;
engine.ver = RegExp['$1']; //获取 WebKit 版本号
}else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) { //获取 Gecko 和它的版本号
engine.ver = RegExp['$1'];
engine.gecko = true;
}else if (/MSIE ([^;]+)/.test(ua)) { //获取 IE 和它的版本号
engine.ie = true;
engine.ver = RegExp['$1'];
}else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
engine.ver = RegExp['$1'];
engine.khtml = true;
} return {
engine : engine //返回呈现引擎对象
};
}(); if(client.engine.opera){
alert("目前使用的是opera浏览器,版本号为:"+client.engine.ver);
}else if(client.engine.WebKit){
alert("WebKit引擎的版本号为:"+client.engine.ver);
}else if(client.engine.gecko){
alert("Gecko引擎的版本号为:"+client.engine.ver);
}else if(client.engine.ie){
alert("ie引擎的版本号为:"+client.engine.ver);
}else if(client.engine.khtml){
alert("KHTML引擎的版本号为:"+client.engine.ver);
}

有解释 的部分:

var client = function () {                 //创建一个对象,自我执行
var engine = { //呈现引擎
ie : false,
gecko : false,
webkit : false,
khtml : false,
opera : false,
ver : 0 //具体的版本号
};
return {
engine : engine //返回呈现引擎对象
};
}(); //判断 Opera:因为 Opera 浏览器支持 window.opera 对象,通过这个对象,我们可以很容易获取到 Opera 的信息。
for (var p in window.opera) { //获取 window.opera 对象信息
document.write(p + "<br />");
}
if (window.opera) { //判断 opera 浏览器
engine.opera = true; //设置真,表示确认是opera引擎
engine.ver = window.opera.version(); //获取 opera 呈现引擎版本
} //通过正则表达式来获取 WebKit 引擎和它的版本号。
else if (/AppleWebKit\/(\S+)/.test(ua)) { //正则 WebKit
engine.ver = RegExp['$1']; //获取 WebKit 版本号
engine.webkit = true;
} //通过正则表达式来获取 KHTML 引擎和它的版本号。由于这款浏览器基于Linux
//获取 KHTML 和它的版本号
else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
engine.ver = RegExp['$1'];
engine.khtml = true;
} //通过正则表达式来获取 IE 的引擎和它的版本号。因为 IE8 之前没有呈现引擎,所以,我们只有通过"MSIE"这个共有的字符串来获取。
else if (/MSIE ([^;]+)/.test(ua)) { //获取 IE 和它的版本号
engine.ver = RegExp['$1'];
engine.ie = true;
} //通过正则表达式来获取 Gecko 引擎和它的版本号。
else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) { //获取 Gecko 和它的版本号
engine.ver = RegExp['$1'];
engine.gecko = true;
}

上面获取各个浏览器的引擎和引擎的版本号,但其实有些确实是浏览器的版本号。所以,下面,我们需要进行浏览器名称的获取和浏览器版本号的获取。根据目前的浏览器市场份额,我们可以给一下浏览器做检测:IE、Firefox、konq、opera、chrome、safari。

有解释的部分

//对于获取 IE 浏览器的名称和版本,可以直接如下:
else if (/MSIE ([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp['$1']; //设置版本
engine.ie = browser.ie = true; //填充保证为 true
browser.name = 'Internet Explorer'; //设置名称
} //对于获取 Firefox 浏览器的名称和版本,可以如下:
else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
engine.ver = RegExp['$1'];
engine.gecko = true;
if (/Firefox\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1']; //设置版本
browser.firefox = true; //填充保证为 true
browser.name = 'Firefox'; //设置名称
}
} //对于获取 Chrome 和 safari 浏览器的名称和版本,可以如下:
else if (/AppleWebKit\/(\S+)/.test(ua)) {
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
if (/Chrome\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = true;
browser.name = 'Chrome';
} else if (/Version\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = true;
browser.name = 'Safari';
}
}
var client = function () {                 //创建一个对象,自我执行
var browser = { //浏览器对象
ie : false,
firefox : false,
konq : false,
opera : false,
chrome : false,safari : false,
ver : 0, //具体版本
name : '' //具体的浏览器名称
};
//核心检测区
var ua = navigator.userAgent; //对于获取 IE 浏览器的名称和版本,可以直接如下:
if (/MSIE ([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp['$1']; //设置版本
engine.ie = browser.ie = true; //填充保证为 true
browser.name = 'Internet Explorer'; //设置名称
}else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
engine.ver = RegExp['$1'];
engine.gecko = true;
if (/Firefox\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1']; //设置版本
browser.firefox = true; //填充保证为 true
browser.name = 'Firefox'; //设置名称
}
}else if (/AppleWebKit\/(\S+)/.test(ua)) {
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
if (/Chrome\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = true;
browser.name = 'Chrome';
} else if (/Version\/(\S+)/.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = true;
browser.name = 'Safari';
}
} return {
browser:browser
};
}(); if(client.browser.firefox){
alert(client.browser.name+client.browser.ver);
}

获取浏览器所宿主的操作系统。

  var system = { //操作系统
win : false, //windows
mac : false, //Mac
x11 : false //Unix、Linux
};
var p = navigator.platform; //获取系统
system.win = p.indexOf('Win') == 0; //判断是否是 windows
system.mac = p.indexOf('Mac') == 0; //判断是否是 mac
system.x11 = (p == 'X11') || (p.indexOf('Linux') == 0) //判断是否是 Unix、Linux

JavaScript浏览器检测之客户端检测的更多相关文章

  1. 《JAVASCRIPT高级程序设计》客户端检测

    web开发的理想状态之一是浏览器支持一组最常用的功能,但是在现实情况下,浏览器间的差异非常大,因此,为了兼容大部分的了浏览器,开发人员首先需要设计最通用的方案,然后再使用客户端检测的技术增强该方案.客 ...

  2. Javascript高级程序设计——客户端检测

    ECMAScript虽然是Javascript的核心,但是要在web中使用Javascript,那么BOM才是核心,BOM为我们提供了操作访问浏览器对象的借口, 但是由于BOM没有标准规范,导致存在不 ...

  3. 检测客户端显示器分辨率、浏览器类型和客户端IP

    原文:检测客户端显示器分辨率.浏览器类型和客户端IP 下面的代码实现了检测客户端显示器分辨率.浏览器类型和客户端IP的功能.你可以把客户端信息保存到Session,ViewState等中以便在其它的页 ...

  4. 读书时间《JavaScript高级程序设计》四:BOM,客户端检测

    隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...

  5. 第一百一十二节,JavaScript浏览器检测

    JavaScript浏览器检测 学习要点: 1.navigator对象 2.客户端检测 由于每个浏览器都具有自己独到的扩展,所以在开发阶段来判断浏览器是一个非常重要的步骤.虽然浏览器开发商在公共接口方 ...

  6. 《JavaScript高级程序设计》笔记:客户端检测(九)

    能力检测 在编写代码之前先检测特定浏览器的能力.例如,脚本在调用某个函数之前,可能要先检测该函数首付存在.这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是 ...

  7. JavaScript浏览器检测之navigator 对象

    一.使用客户端检测的原因 由于每个浏览器都具有自己独到的扩展,所以在开发阶段来判断浏览器是一个非常重要的步骤. 虽然浏览器开发商在公共接口方面投入了很多精力,努力的去支持最常用的公共功能: 但在现实中 ...

  8. JavaScript高级程序设计学习笔记第九章--客户端检测

    1.能力检测:能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力.(我的理解就是识别浏览器能做什么不能做什么) 2.怪癖检测:目标是识别浏览器的特殊行为.但与能力检测确认浏览器支持什么能力不同, ...

  9. [Javascript]客户端检测

    客户端检测是一种行之有效的开发策略.但不到万不得已,就不要使用客户端检测.先设计通用的方案,然后根据浏览器之间的差异和各自的怪癖quirky,再使用特定于浏览器的技术增强该方案. 能力检测 Featu ...

随机推荐

  1. [转]Http请求中Content-Type讲解以及在Spring MVC中的应用

    本文转自:http://blog.csdn.net/blueheart20/article/details/45174399 引言: 在Http请求中,我们每天都在使用Content-type来指定不 ...

  2. UEditor图片焦点错位,火狐document.body.scrollTop不管用的问题

    转自 http://liyunpeng.iteye.com/blog/2068751 关于 document.body.scrollTop 在火狐浏览器中不管用的问题 看网上有人写通过判断docume ...

  3. asp.netCore连接多个数据库

    1.首先要有对应的context实体类, 多个实体类的构造函数的参数都应该是集合 public class firstContext : DbContext { //多个数据库应该使用这个构造函数,参 ...

  4. MySQL 数据类型总结及选取准则

    整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用    8          ,  16            24,          ...

  5. JDBC入门(2)--- ResultSet之滚动结果集

    一.ResultSet之滚动结果集 ResultSet表示结果集,它是一个二维的表格.ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标: void befo ...

  6. 记录一次teamview无法远程连接对方teamview的过程

    问题描述: teamviewer 提示 超时后连接被阻断.您的许可证对您与伙伴的最大话时间有所限制...... 解决方法: 1.先将自己的teamview完全卸载,连同安装目录一起删除.尽量卸载完全 ...

  7. Django,ajax实现表格增删查改,Django内置分页功能。

    1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...

  8. ZJOI2012 网络——LCT相关题目

    有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...

  9. JavaScript的进阶之路(六)理解函数

    函数:定义一次,多次调用:用于对象的属性则称为对象的方法:在JavaScript中,函数即对象:嵌套的函数形成闭包: 定义函数和简单调用函数: //函数定义 function f1(){ //没有参数 ...

  10. Android BitmapFactory.Options

    public Bitmap inBitmap 如果设置,解码选项“对象的方法,采取将尝试重用这个位图加载内容时. public int inDensity 使用的位图的象素密度. public boo ...