1.浏览器及版本号
不同的浏览器支持的功能、属性和方法各有不同。比如IE 和Firefox 显示的页面可能就
会有所略微不同。

alert('浏览器名称:' + navigator.appName);
alert('浏览器版本:' + navigator.appVersion);
alert('浏览器用户代理字符串:' + navigator.userAgent);
alert('浏览器所在的系统:' + navigator.platform);

2.浏览器嗅探器
浏览器嗅探器是一段程序,有了它,浏览器检测就变得简单了。我们这里提供了一个
browserdetect.js 文件,用于判断浏览器的名称、版本号及操作系统。

调用方式 说明
BrowserDetect.browser 浏览器的名称,例如Firefox,IE
BrowserDetect.version 浏览器的版本,比如,7、11
BrowserDetect.OS 浏览器所宿主的操作系统,比如Windows、Linux

 

alert(BrowserDetect.browser); //名称
alert(BrowserDetect.version); //版本
alert(BrowserDetect.OS) //系统

3.检测插件
插件是一类特殊的程序。他可以扩展浏览器的功能,通过下载安装完成。比如,在线音
乐、视频动画等等插件。
navigator 对象的plugins 属性,这个一个数组。存储在浏览器已安装插件的完整列表。

属性 含义
name 插件名
filename 插件的磁盘文件名
length plugins 数组的元素个数
description 插件的描述信息

//列出所有的插件名
for (var i = 0; i < navigator.plugins.length; i ++) {
document.write(navigator.plugins[i].name + '<br />');
}
//检测非IE 浏览器插件是否存在
function hasPlugin(name) {
var name = name.toLowerCase();
for (var i = 0; i < navigator.plugins.length; i ++) {
if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
return true;
}
}
return false;
}
alert(hasPlugin('Flash')); //检测Flash 是否存在
alert(hasPlugin('java')) //检测Java 是否存在

4.ActiveX
IE 浏览器没有插件,但提供了ActiveX 控件。ActiveX 控件一种在Web 页面中嵌入对象或组件的方法。
由于在JS 中,我们无法把所有已安装的ActiveX 控件遍历出来,但我们还是可以去验
证是否安装了此控件。

//检测IE浏览器的控件
function hasIEPlugin(name) {
try { //这里叫做尝试着去执行一段代码,如果有误,就去执行catch
new ActiveXObject(name) //这里的name必须是控件的唯一标识符ID
return true; //如果new 成功了,没有产生错误,那么就不去执行catch
} catch (e) {
return false; //如果new 失败了,就执行catch里面的语句
}
}

alert(hasIEPlugin('ShockwaveFlash.ShockwaveFlash'));
PS:ShockwaveFlash.ShockwaveFlash 是IE 中代表FLASH 的标识符,你需要检查哪种控件,必须先获取它的标识符。

跨浏览器检测是否支持Flash

function hasFlash() {
var result = hasPlugin('Flash');
if (!result) {
result = hasIEPlugin('ShockwaveFlash.ShockwaveFlash');
}
return result;
}
//检测Flash
alert(hasFlash());

 二、客户端检测

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

1.能力检测
能力检测又称作为特性检测,检测的目标不是识别特定的浏览器,而是识别浏览器的能力。能力检测不必估计特定的浏览器,只需要确定当前的浏览器是否支持特定的能力,就可以给出可行的解决方案。

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
    }
}

PS:上面其实有两块地方使用了能力检测,

第一个就是是否支持innerWidth 的检测,第二个就是是否是标准模式的检测,这两个都是能力检测。

2.怪癖检测(bug 检测)
与能力检测类似,怪癖检测的目标是识别浏览器的特殊行为。但与能力检测确认浏览器支持什么能力不同,怪癖检测是想要知道浏览器存在什么缺陷(bug)。
bug 一般属于个别浏览器独有,在大多数新版本的浏览器被修复。

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

3.用户代理检测

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

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

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 CLR
2.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 CLR
1.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 CLR
2.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 体现出来了,之前的未体现
Firefox -- Gecko,
Opera -- Presto, 旧版本根本无法体现呈现引擎
Chrome -- WebKit WebKit 是KHTML 呈现引擎的一个分支,后独立开来
Safari -- WebKit
Konqueror -- KHTML
由上面的情况,我们需要检测呈现引擎可以分为五大类:IE、Gecko、WebKit、KHTML
和Opera。

//用户代理字符串
document.write(navigator.userAgent);
document.write('<br />');
document.write(navigator.platform); var client = function () { //创建一个对象
//引擎
var engine = {
ie : false, //这个属性用于确定是否是IE引擎
gecko : false,
webkit : false,
khtml : false,
opera : false, //引擎的版本
ver : 0
}; //浏览器
var browser = {
ie : false,
firefox : false,
chrome : false,
safari : false,
opera : false, //浏览器的版本号
ver : 0,
//浏览器通用名称
name : ''
}; //系统
var system = {
win : false,
mac : false,
x11 : false, //系统名称
sysname : ''
}; //核心检测程序区
var ua = navigator.userAgent;
var p = navigator.platform; if (p.indexOf('Win') == 0) {
system.win = true; //用于确定是windows系统
system.sysname = 'Windows';
} else if (p.indexOf('Mac') == 0) {
system.mac = true; //用于确定是Mac系统
system.sysname = 'Macintosh';
} else if (p == 'X11' || p.indexOf('Linux') == 0) {
system.x11 = true; //用于确定是Mac系统
system.sysname = 'Linux';
} if (window.opera) {
engine.opera = browser.opera = true; //表示确定opera引擎
engine.ver = browser.ver = window.opera.version();
browser.name = 'Opera';
} else if (/AppleWebKit\/(\S+)/.test(ua)) {
engine.webkit = true; //表示确定webkit引擎
engine.ver = RegExp['$1'];
if (/Chrome\/(\S+)/.test(ua)) {
browser.chrome = true;
browser.ver = RegExp['$1'];
browser.name = 'Chrome';
} else {
browser.safari = true;
if (/Version\/(\S+)/.test(ua)) browser.ver = RegExp['$1'];
browser.name = 'Safari';
}
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
engine.gecko = true; //表示确定gecko引擎
engine.ver = RegExp['$1'];
if (/Firefox\/(\S+)/.test(ua)) {
browser.firefox = true;
browser.ver = RegExp['$1'];
browser.name = 'Firefox';
}
} else if (/MSIE ([^;]+)/.test(ua)) {
engine.ie = browser.ie = true; //表示确定ie引擎
engine.ver = browser.ver = RegExp['$1'];
browser.name = 'Internet Explorer';
} return { //返回一个对象,可以同时返回引擎,浏览器和系统的对象
engine : engine, //前一个engine是属性,后一个engine是对象值
browser : browser,
system : system
} }(); //自我执行,并赋值 alert(client.system.sysname + '|' +client.browser.name + client.browser.ver);

浏览器检测navigator 对象的更多相关文章

  1. 快捷获取浏览器(navigator对象)的全部属性

    理论:     navigator对象包含关于web浏览器的信息,浏览器的类型,版本信息都可以从该对象获取. 属性 说明 appCodeName 浏览器代码说明 appName 浏览器名称 appVe ...

  2. Navigator对象关于语言的属性

    [摘要]在做国际化WEB项目的时候,遇到了一个根据用户浏览器所使用的自然语言切换默认语言版本的问题.于是,整理了这篇文章. 首先,W3Cschool关于Navigator的各个属性值说的很明确了,这里 ...

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

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

  4. JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。

    Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本. 对象属性: 查看浏览器的名称和版本,代码如下: <script type=" ...

  5. 利用navigator对象在浏览器中检查插件

    利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...

  6. BOM之navigator对象和用户代理检测

    前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准,navigator对象是所有支持javascript的浏览器所共有的.本文将详细介绍navigator对象和用户代理检测 属性 ...

  7. navigator.userAgent浏览器检测(前端基础系列)

    对于前端来说,浏览器检测已经不陌生了,在做一些页面是,需要针对不同的浏览器进行处理不同的逻辑,最简单的就是区分pc和移动端的浏览器,或是android 和ios下的浏览器. 一.浏览器检测的由来?  ...

  8. 浏览器端-W3School-JavaScript-Browser: Navigator 对象

    ylbtech-浏览器端-W3School-JavaScript-Browser: Navigator 对象 1.返回顶部 1. Navigator 对象 Navigator 对象 Navigator ...

  9. js中的navigator对象

    Navigator 对象包含有关浏览器的信息.所有浏览器都支持该对象 在控制台中输出相关信息的代码 <script> console.log(navigator); </script ...

随机推荐

  1. Azure Remote Desktop: "An error occurred while loading from file *.rdp"

    Tonight I deployed a new cloud service where I needed remote desktop to check on some things. After ...

  2. tengine安装lua

    转子: http://www.cnblogs.com/shengshuai/p/4244851.html 参考: http://www.ttlsa.com/nginx/nginx-lua/ 学习:ht ...

  3. C# 模拟并发

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 当然,题外话说多了,咱进入正题! 在处理大数据的时候,经常会发生并发,并发的情况发生后,会出现数据污读,从而产生脏数据. 首 ...

  4. LinkedHashMap 和 LRU算法实现

    个人觉得LinkedHashMap 存在的意义就是为了实现 LRU 算法. public class LinkedHashMap<K,V> extends HashMap<K,V&g ...

  5. bootstrap datetimepicker时间日期控件

    github地址:https://github.com/smalot/bootstrap-datetimepicker Both Date and Time picker widget based o ...

  6. 当As3遇见Swift(三)

    类 As3 Swift中似乎没有包,包路径的概念.因而显得简洁的多. package { public class ShuaiGe { } } Swift类 class ShuaiGe{ } 类的构造 ...

  7. F面经prepare:strstr变种

    * Given an integer k>=1 and two strings A and B (length ~n each); * Figure out if there is any co ...

  8. 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8170   Accept ...

  9. [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组

    1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...

  10. Python学习总结14:时间模块datetime & time & calendar (一)

    Python中的常用于处理时间主要有3个模块datetime模块.time模块和calendar模块. 一.time模块 1. 在Python中表示时间的方式 1)时间戳(timestamp):通常来 ...