YUI.UA是针对javascript的宿主环境检测的一个检测对象,返回的是一系统关于当前宿主的信息

1.对象相关信息列表及userAgent

检测对象o = {
ie: 0,
//ie Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) opera: 0,
//opera Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 OPR/16.0.1196.62
gecko: 0,
// ff Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0
webkit: 0,
//检测webkit内核版本
safari: 0,
//safari Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
chrome: 0,
//chrome Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.10 Safari/537.36
mobile: null,
//检测是否是手机 Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 (Android)
air: 0,
//检测 Adobe AIR的版本
phantomjs: 0,
//phantomjs 是以webkit为核心并提供javascript编程接口(API)的无显示浏览器
ipad: 0,
//ipad Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
iphone: 0,
//iphone Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
ipod: 0,
ios: null,
//ios系统 iphone | ipad | ipod
android: 0,
//android 系统
silk: 0,
// 亚马逊推出的基于安卓的平板浏览器 全名为Kindle Silk
accel: false,
//Kindle Silk是否启动加速
webos: 0,
//webos
caja: nav && nav.cajaVersion,
//google发起的让javascript更安全的caja项目
secure: false,
//SSL中是否设置
os: null,
//操作系统,目前仅检测window或macintosh
nodejs: 0,
//nodejs版本
winjs: !!((typeof Windows !== "undefined") && Windows.System),
//window8与ie10的应用环境
touchEnabled: false
//是否支持触摸
},

2.定义一个公用函数,用于检测版本号

版本检测函数var numberify = function(s) {
var c = 0;
return parseFloat(s.replace(/\./g, function() {
return (c++ === 1) ? '' : '.';
}));
},

这个函数的就是将’123.234.42.42424’ =>  123.23442

变更一下 :保留第一个符号,后面相同的符号全部去掉

版本检测函数var numberify = function (s) {
var i = 0;
return parseFloat(s.replace(/\./g,function(){
return ( i++ === 0 ) ? '.' : '';
})
}
// '1.2.3.4.5.6' ==> 1.23456 来自http://zhangyaochun.iteye.com/blog/1840297

再变更一下:获取一个寻址

版本检测函数//最快的也是seajs采用的
function dirname (path) {
var s = path.match ( /.*(?=\/.*$)/);
return ( s ? s[0] : '.' ) + '/';
}
//第二种
function dirname(path){
var s = path.split('/').slice(0,-1).join('/');
return s ? s : '.';
}
第三种
function dirname(path){
var s = ('./' + path).replace(/(.*)?\/.*/, '$1').substring(2);
return s ? s : '.';
}
/* "a.js" ===> "./" * "a/b.js" ===> "a/" * "a/b/c.js" ===> "a/b/"
来自 http://zhangyaochun.iteye.com/blog/1693798
*/

3.开始检测

版本检测函数YUI.UA = function (subUA) {
//numberify函数
//o对象
//nav,ua赋值 nav = window.navigator
ua = subUA || nav && nav.userAgent
href = window.location && window.location.href
o.userAgent = ua
}

a.  安全设置o.secure是根据href中是否以https开始来设置值 (http与https的区      别http://www.cnblogs.com/wxlzhizu/archive/2009/12/09/1620005.html

o.secure = href && (href.toLowerCase().indexOf(‘https’) === 0);

b. 检测顺序如下 (操作系统 –> 检测内核及是否是手机 –> 检测webkit内核 【opera15+特殊,手机项】 –>  检测不是webkit 【opera低版本】 –>  IE

检测顺序if (ua) {
//检测操作系统
if ((/windows|win32/i).test(ua)) {
o.os = 'windows';
} else if ((/macintosh|mac_powerpc/i).test(ua)) {
o.os = 'macintosh';
} else if ((/android/i).test(ua)) {
o.os = 'android';
} else if ((/symbos/i).test(ua)) {
o.os = 'symbos';
} else if ((/linux/i).test(ua)) {
o.os = 'linux';
} else if ((/rhino/i).test(ua)) {
o.os = 'rhino';
} // Modern KHTML browsers should qualify as Safari X-Grade
if ((/KHTML/).test(ua)) {
o.webkit = 1;
}
if ((/IEMobile|XBLWP7/).test(ua)) {
o.mobile = 'windows';
}
if ((/Fennec/).test(ua)) {
o.mobile = 'gecko';
}
// Modern WebKit browsers are at least X-Grade 检测webkit类浏览器
m = ua.match(/AppleWebKit\/([^\s]*)/);
if (m && m[1]) {
o.webkit = numberify(m[1]);
o.safari = o.webkit; if (/PhantomJS/.test(ua)) {
m = ua.match(/PhantomJS\/([^\s]*)/);
if (m && m[1]) {
o.phantomjs = numberify(m[1]);
}
} // Mobile browser check 手机项
if (/ Mobile\//.test(ua) || (/iPad|iPod|iPhone/).test(ua)) {
o.mobile = 'Apple'; // iPhone or iPod Touch m = ua.match(/OS ([^\s]*)/);
if (m && m[1]) {
m = numberify(m[1].replace('_', '.'));
}
o.ios = m;
o.os = 'ios';
o.ipad = o.ipod = o.iphone = 0; m = ua.match(/iPad|iPod|iPhone/);
if (m && m[0]) {
o[m[0].toLowerCase()] = o.ios; //设置iphone ipod ipad的版本
}
} else {
m = ua.match(/NokiaN[^\/]*|webOS\/\d\.\d/);
if (m) {
// Nokia N-series, webOS, ex: NokiaN95
o.mobile = m[0];
}
if (/webOS/.test(ua)) {
o.mobile = 'WebOS';
m = ua.match(/webOS\/([^\s]*);/);
if (m && m[1]) {
o.webos = numberify(m[1]);
}
}
if (/ Android/.test(ua)) {
if (/Mobile/.test(ua)) {
o.mobile = 'Android';
}
m = ua.match(/Android ([^\s]*);/);
if (m && m[1]) {
o.android = numberify(m[1]);
} }
if (/Silk/.test(ua)) {
m = ua.match(/Silk\/([^\s]*)\)/);
if (m && m[1]) {
o.silk = numberify(m[1]);
}
if (!o.android) {
o.android = 2.34; //Hack for desktop mode in Kindle
o.os = 'Android';
}
if (/Accelerated=true/.test(ua)) {
o.accel = true;
}
}
} m = ua.match(/OPR\/(\d+\.\d+)/); //以OPR来作条件是因为opera15+ ua中会有chrome safari OPR的版本号 if (m && m[1]) {
// Opera 15+ with Blink (pretends to be both Chrome and Safari) opera15+采用chromium引擎
o.opera = numberify(m[1]);
} else {
m = ua.match(/(Chrome|CrMo|CriOS)\/([^\s]*)/); if (m && m[1] && m[2]) {
o.chrome = numberify(m[2]); // Chrome
o.safari = 0; //Reset safari back to 0
if (m[1] === 'CrMo') {
o.mobile = 'chrome';
}
} else {
m = ua.match(/AdobeAIR\/([^\s]*)/);
if (m) {
o.air = m[0]; // Adobe AIR 1.0 or better
}
}
}
} if (!o.webkit) { // not webkit
// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
if (/Opera/.test(ua)) {
m = ua.match(/Opera[\s\/]([^\s]*)/);
if (m && m[1]) {
o.opera = numberify(m[1]);
}
m = ua.match(/Version\/([^\s]*)/);
if (m && m[1]) {
o.opera = numberify(m[1]); // opera 10+
} if (/Opera Mobi/.test(ua)) {
o.mobile = 'opera';
m = ua.replace('Opera Mobi', '').match(/Opera ([^\s]*)/);
if (m && m[1]) {
o.opera = numberify(m[1]);
}
}
m = ua.match(/Opera Mini[^;]*/); if (m) {
o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
}
} else { // not opera or webkit
m = ua.match(/MSIE ([^;]*)|Trident.*; rv:([0-9.]+)/); if (m && (m[1] || m[2])) {
o.ie = numberify(m[1] || m[2]);
} else { // not opera, webkit, or ie
m = ua.match(/Gecko\/([^\s]*)/); if (m) {
o.gecko = 1; // Gecko detected, look for revision
m = ua.match(/rv:([^\s\)]*)/);
if (m && m[1]) {
o.gecko = numberify(m[1]);
if (/Mobile|Tablet/.test(ua)) {
o.mobile = "ffos";
}
}
}
}
}
}
}

c. 是否支持触摸检测

触摸if (win && nav && !(o.chrome && o.chrome < 6)) {
o.touchEnabled = (("ontouchstart" in win) || (("msMaxTouchPoints" in nav) && (nav.msMaxTouchPoints > 0)));
}

d.不是客户端版的js检测

nodejsif (!subUA) {

        if (typeof process === 'object') {

            if (process.versions && process.versions.node) {
//NodeJS
o.os = process.platform;
o.nodejs = numberify(process.versions.node);
}
} YUI.Env.UA = o; }

4.版本比较函数,采用sort中函数的写法

版本比较函数compareVersions = function (a, b) {
var aPart, aParts, bPart, bParts, i, len; if (a === b) {
return 0;
}
//转换成数组
aParts = (a + '').split('.');
bParts = (b + '').split('.');
//取两个数组中元素多的为长度进行循环
for (i = 0, len = Math.max(aParts.length, bParts.length); i < len; ++i) {
aPart = parseInt(aParts[i], 10);
bPart = parseInt(bParts[i], 10); /*jshint expr: true*/
isNaN(aPart) && (aPart = 0);
isNaN(bPart) && (bPart = 0); if (aPart < bPart) {
return -1;
} if (aPart > bPart) {
return 1;
}
} return 0;
};

YUI的UA检测的更多相关文章

  1. 网站访问者UA检测及跳转

    /*!* UA检测及跳转*/;(function(){ var whatdevice = {}; var myUA = window.navigator.userAgent.toLowerCase() ...

  2. 移动端设备UA检测

    网上找到的都不全,不是漏这个就是漏那个,有的甚至还把桌面的chrome判断为移动浏览器. 于是自己动手整理,这回算是比较全了.以后发现漏掉的立马加上. if(/AppleWebKit.*Mobile/ ...

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

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

  4. 【MarkMark学习笔记学习笔记】javascript/js 学习笔记

    1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...

  5. 让那些为Webkit优化的网站也能适配IE10

    特别声明:此篇文章由David根据Charles Morris的英文文章原名<Adapting your WebKit-optimized site for Internet Explorer ...

  6. javascript学习笔记全记录

          js的初步了解     1.就是用来修改样式的,修改的是行内样式.任何样式都能够修改.     2.css里面怎么写js就怎么写.     3.任何元素都能加事件:事件都要小写 js的三大 ...

  7. 让那些为Webkit优化的网站也能适配IE10(转载)

    转载地址:http://www.w3cplus.com/css3/adapting-your-webkit-optimized-site-for-internet-explorer-10.html 特 ...

  8. PHP Header下载文件在IE文件名中文乱码问题

    解决PHP Header下载文件在IE文件名中文乱码有两种常见的,一种是是把页面编码改成utf8,另一种是对中文url进入urlencode编码,根据UA检测,区别下载,就可以解决了 $filenam ...

  9. JS编程常识

    一.UI层的松耦合 松耦合就是要求各层遵循“最少知识原则”,或者说是各层各司其职,不要越权: HTML:结构层 CSS:表现层 JS:行为层 对于各层的职能,有一句比较贴切的解释:HTML是名词(n) ...

随机推荐

  1. python之pandas模块

    一.pandas模块是基于Numpy模块的,pandas的主要数据结构是Series和DadaFrame,下面引入这样的约定: from pandas import Series,DataFrame ...

  2. HTML5 例子学习 HT 图形组件

    HTML5 例子学习 HT 图形组件 HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心 ...

  3. Java学习笔记--多线程

    rollenholt的博文:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 弹球例子: 0. 创建Bounce框架 ...

  4. Linux下使用sendmail发送邮件

    现在每天需要将统计数据发送给指定的人员. 使用原始手工的方式每天发送很麻烦,于是想改成一个定时任务,让服务器自动发送. 技术告诉我说他有写过sendmail的一个脚本. 我尝试使用了一下,发现 ser ...

  5. Block(二)内存管理与其他特性

    一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. CentOS终端操作mysql

    1.停用mysql服务:service mysqld stop 重启mysql服务:service mysql restart 2.mysql 1045ERROR:mysqld_safe --user ...

  7. VS2010安装MSDN

    VS2010正式版不再有单独的MSDN Library安装选项,以至于很多同学找不到本地的MSDN Library来用,其实VS2010的ISO安装光盘里已经包含有MSDN Library,只不过要手 ...

  8. LeetCode_Reverse Integer

    Reverse digits of an integer. Example1: x = , Example2: x = -, class Solution { public: int reverse( ...

  9. 《Programming WPF》翻译 第6章 3.二进制资源

    原文:<Programming WPF>翻译 第6章 3.二进制资源 尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满 ...

  10. Unix/Linux环境C编程入门教程(42) 终端控制篇

    函数介绍 getopt(分析命令行参数) 相关函数 表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ...