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


Posted in Javascript onFebruary 10, 2017

前面的话

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

属性

与其他BOM对象的情况一样,每个浏览器中的navigator对象也都有一套自己的属性。下表列出了存在于所有浏览器中的属性和方法,以及支持它们的浏览器版本

属性                                              说明

appCodeName             浏览器名称[所有浏览器都返回Mozilla]

userAgent               浏览器的用户代理字符串

appVersion              浏览器版本

appMinorVersion         次版本信息[IE返回0,chrome和firefox不支持]

platform                浏览器所在的系统平台[所有浏览器都返回Win32]

plugins                 浏览器中安装的插件信息的数组

mimeTypes               在浏览器中注册的MIME类型数组

language                浏览器主语言[IE10-不支持,其他浏览器返回zh-CN]

systemLanguage          操作系统语言[IE返回zh-CN,chrome和firefox不支持]

userLanguage            操作系统默认语言[IE返回zh-CN,chrome和firefox不支持]

product                 产品名称[IE10-不支持,其他浏览器返回Gecko]

productSub              产品次要信息[IE不支持,chrome返回20030107,firefox返回20100101]

vendor                  浏览器品牌[chrome返回Google Inc.,IE和firefox不支持]

onLine                  是否连接因特网[IE根据实际情况返回true或false,chrome和firefox始终返回true]

cookieEnabled           表示cookie是否启用[所有浏览器都返回true]

javaEnabled             是否启用java[IE8-浏览器返回{},其他浏览器返回function javaEnabled()]

buildID                 浏览器编译版本[firefox返回20170125094131,chrome和IE不支持]

cpuClass                计算机使用的CPU类型[IE返回x86,chrome和firefox不支持]

oscpu                   操作系统或使用的CPU[firefox返回Windows NT 10.0; WOW64,chrome和IE不支持]

检测插件

检测浏览器插件是一种最常见的检测例程

对于非IE浏览器,可以使用plugins数组来达到这个目的该数组中的每一项都包含下列属性

name:插件的名字 

description:插件的描述

filename:插件的文件名

length:插件所处理的MIME类型数量

通过循环迭代每个插件并将插件的name与给定的名字进行比较

function hasPlugin(name){
 name = name.toLowerCase();
 for(var i = 0; i < navigator.plugins.length; i++){
  if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){
   return true;
  }
 }
}
//检测flash
console.log(hasPlugin("Flash"));//true

对于IE浏览器,检测插件的办法是使用专有的ActiveXObject类型,并尝试创建一个特定插件的实例。IE是使用COM对象来实现插件的,而COM对象使用唯一标识符来标识。因此,想检查特定的插件就必须知道其COM标识符。例如,Flash的标识符是ShockwaveFlash.ShockwaveFlash

function hasIEPlugin(name){
 try{
  new ActiveXObject(name);
  return true;
 }catch(ex){
  return false;
 }
}
//检测Flash
console.log(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"))//true

【兼容写法】

//检测非IE中的插件
function hasPlugin(name){
 name = name.toLowerCase();
 for(var i = 0; i < navigator.plugins.length; i++){
  if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){
   return true;
  }
 }
}
//检测IE中的插件
function hasIEPlugin(name){
 try{
  new ActiveXObject(name);
  return true;
 }catch(ex){
  return false;
 }
}
function hasFlash(){
 var result = hasPlugin("Flash");
 if(!result){
  result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
 }
 return result;
}
console.log(hasFlash());//true

用户代理检测

navigator对象中最重要的作用就是使用useragent实现用户代理检测。用户代理检测是一种万不得已的做法,优先级排在前面介绍过的能力检测之后

发展历史

1、1993年美国NCSA国家超级计算机中心发布了世界上第一款web浏览器Mosaic,该浏览器的用户代理字符串为Mosaic/0.9

2、Netscape公司进入浏览器开发领域,将自己产品的代号定名了Mozilla(Mosaic Killer)的简写,用户代理字符串格式为Mozilla/版本号 [语言] (平台;加密类型)

3、IE赢得用户广泛认可的web浏览器IE3发布时,Netscape已经占据了绝对市场份额,为了让服务器能够检测到IE,IE将用户代理字符串修改成兼容Netscape的形式:Mozilla/2.0(compatible;MSIE版本号;操作系统)

4、各浏览器陆续出现,用户代理字符串的显示格式也越来越类似……

HTTP规范明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。但现实中却没有这么简单,各浏览器的检测结果如下所示

检测结果

【IE3】

Mozilla/2.0 (compatible; MSIE3.02; windows 95)

【IE6】

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

【IE7】

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)

【IE8】

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)

【IE9】

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

【IE10】

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)

【IE11】

Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; GWX:QUALIFIED; rv:11.0) like Gecko

【chrome】

Mozilla/5.0 (Windows NT 6.1; WOW64)G AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36

【safari】

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

【firefox】

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0

【opera】

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25

【ipad】

Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53

【iphone】

Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4

【android】

Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36

识别内核

常见的内核有Trident、Gecko和Webkit

[注意]因为Trident和Webkit的用户代理字符串中可能会出现like Gecko的字眼,所以最后再测Gecko

function whichEngine(){
 var ua = navigator.userAgent;
 //Trident内核
 if(/Trident/.test(ua)){
  return "Trident";
 }
 //Webkit内核
 if(/WebKit/.test(ua)){
  return "WebKit";
 }  
 //Gecko内核
 if(/Gecko/.test(ua)){
  return "Gecko";
 }
}
console.log(whichEngine());//IE11下显示"Trident"

识别浏览器

【1】IE

  IE3-IE10都可以通过MSIE的版本号来判断,因为有的IE11并不出现MSIE字符,且safari中也有rv字段,所以IE11需要通过rv后的版本号和Trident来配合判断

function isIE(){
 var ua = navigator.userAgent;
 //检测Trident引擎,IE8+
 if(/Trident/.test(ua)){
  //IE11+
  if(/rv:(\d+)/.test(ua)){
   return RegExp["$1"];
  } 
  //IE8-IE10 
  if(/MSIE (\d+)/.test(ua)){
   return RegExp["$1"];
  }  
 }
 //检测IE标识,IE7-
 if(/MSIE (\d+)/.test(ua)){
  return RegExp["$1"];
 } 
}
console.log(isIE());//只有IE会返回版本号,其他浏览器都返回undefined

【2】chrome

function isChrome(){
 var ua = navigator.userAgent;
 //先排除opera,因为opera只是在chrome的userAgent后加入了自己的标识
 if(!/OPR/.test(ua)){
  if(/Chrome\/(\S+)/.test(ua)){
   return RegExp["$1"];
  } 
 } 
}
console.log(isChrome());//只有Chrome会返回版本号45.0.2454.93,其他浏览器都返回undefined

【3】safari

function isSafari(){
 var ua = navigator.userAgent;
 //先排除opera
 if(!/OPR/.test(ua)){
  //检测出chrome和safari浏览器
  if(/Safari/.test(ua)){
   //检测出safari
   if(/Version\/(\S+)/.test(ua)){
    return RegExp["$1"];
   }  
  }
 } 
}
console.log(isSafari());//只有safari会返回版本号5.1.7,其他浏览器都返回undefined

【4】firefox

function isFireFox(){
 if(/Firefox\/(\S+)/.test(navigator.userAgent)){
  return RegExp["$1"];
 } 
}
console.log(isFireFox());//只有firefox会返回版本号40.0,其他浏览器都返回undefined

【5】opera

function isOpera(){
 if(/OPR\/(\S+)/.test(navigator.userAgent)){
  return RegExp["$1"];
 } 
}
console.log(isOpera());//只有opera会返回版本号32.0.1948.25,其他浏览器都返回undefined

识别操作系统

使用navigator.platform检测操作系统更加简单,因为其可能包括的值为“Win32”、“Win64”、“MacPPC”、“MacIntel”、“X11”和"Linux i686"等,且在不同浏览器中是一致的

而通过navigator.userAgent可以来得到window系统的详细信息

windows版本      ->    内核版本
Windows XP      ->    5.1
Windows Vista      ->    6.0
Windows 7       ->    6.1
Windows 8       ->    6.2
Windows 8.1      ->    6.3
Windows 10技术预览版      ->    6.4
Windows 10.0

   ->    10.0
function whichSyStem(){
 var ua = navigator.userAgent;
 var pf = navigator.platform;
 if(/Mac/.test(pf)){
  return "Mac";
 }
 if(/X11/.test(pf) || /Linux/.test(pf)){
  return "Linux";
 }
 if(/Win/.test(pf)){
  if(/Windows NT (\d+\.\d+)/.test(ua)){
   switch(RegExp["$1"]){
    case "5.0":
     return "Windows 2000";
    case "5.1":
     return "Windows XP";
    case "6.0":
     return "Windows Vista";
    case "6.1":
     return "Windows 7";
    case "6.2":
     return "Windows 8";
    case "6.3":
     return "Windows 8.1";
    case "6.4":
    case "10.0":
     return "Windows 10";     
   }
  }
 }
}
console.log(whichSyStem())//Windows 10

识别移动端

function whichMobile(){
 var ua = navigator.userAgent;
 if(/iPhone OS (\d+_\d+)/.test(ua)){
  return 'iPhone' + RegExp.$1.replace("_",".");
 }
 if(/iPad.+OS (\d+_\d+)/.test(ua)){
  return 'iPad' + RegExp.$1.replace("_",".")
 }
 if(/Android (\d+\.\d+)/.test(ua)){
  return 'Android' + RegExp["$1"];
 }
}
console.log(whichMobile())//Android 5.1

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
JQuery开发的数独游戏代码
Oct 29 Javascript
javascript 循环调用示例介绍
Nov 20 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 Javascript
angularjs中ng-attr的用法详解
Dec 31 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
Mar 12 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
Apr 26 Javascript
js+canvas绘制图形验证码
Sep 21 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 #Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
Feb 10 #Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
Feb 10 #Javascript
javascript自执行函数
Feb 10 #Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 #Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 #Javascript
JS验证不重复验证码
Feb 10 #Javascript
You might like
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
初学JavaScript第二章
2008/09/30 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
angular动态表单制作
2018/02/23 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
webpack优化的深入理解
2018/12/10 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
vue实现选中效果
2020/10/07 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
就业协议书的作用
2014/04/11 职场文书
社区助残日活动总结
2014/08/29 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers