判断浏览器 插件 jquery.ua.js
判断浏览器 插件
jquery.ua.js
/*!
* jquery.ua.js
* @link https://github.com/cloudcome/jquery.ua
* @author ydr.me
*/ module.exports = function($){
'use strict'; var
win = window,
nav = win.navigator,
navua = nav.userAgent,
appVersion = nav.appVersion,
doc = win.document,
parseRule = _getRules(),
ieAX = win.ActiveXObject,
ieMode = doc.documentMode,
// [10,)版本就无法判断
ieVer = _getIeVersion() || ieMode || 0,
isIe = ieAX || ieMode,
chromiumType = _getChromiumType(),
// 以下为静态属性
statics = {
// ie浏览器
isIe: !! ieVer,
isIe6: ieAX && ieVer == 6 || ieMode == 6,
isIe7: ieAX && ieVer == 7 || ieMode == 7,
isIe8: ieAX && ieVer == 8 || ieMode == 8,
isIe9: ieAX && ieVer == 9 || ieMode == 9,
isIe10: ieMode === 10,
isIe11: ieMode === 11,
ie: ieVer,
// chrome
isChrome: chromiumType === 'chrome',
is360ee: chromiumType === '360ee',
is360se: chromiumType === '360se',
isSougou: chromiumType === 'sougou',
isLiebao: chromiumType === 'liebao',
isFirefox: win.scrollMaxX !== undefined,
isMaxthon: ieVer && /\bmaxthon\b/i.test(appVersion),
isQQ: !!ieVer && /\bqqbrowser\b/i.test(appVersion)
}, i; $.ua = function(ua) {
var _ua = new Constructor(ua);
return _ua._parse();
}; for (i in statics) {
$.ua[i] = statics[i];
} // =======================================
// ================ UA ===================
// ======================================= function Constructor(ua) {
this.ua = (ua || navua || '').toLowerCase();
this.isWebkit = !1;
this.isGecko = !1;
this.isTrident = !1;
} Constructor.prototype = {
_parse: function() {
var that = this,
objPlatform = _parse(parseRule.platforms, that.ua),
objBrowser = _parse(parseRule.browsers, that.ua, !0),
objEngine = _parse(parseRule.engines, that.ua); // 操作平台
that.platform = $.extend({}, objPlatform, {
os: win.navigator.platform.toLowerCase()
}); // 浏览器UA外壳
that.browser = objBrowser; // 浏览器UA内核
that.engine = objEngine; // UA内核
that.isWebkit = !! objEngine.isWebkit;
that.isGecko = !! objEngine.isGecko;
that.isTrident = !! objEngine.isTrident; // UA类型
that.isMobile = objPlatform.isMobile;
that.isTablet = objPlatform.isTablet;
that.isDesktop = objPlatform.isDesktop; return that;
}
}; /**
* 解析
* 参考:https://github.com/terkel/jquery-ua
* @param {Array} 需要解析的数据
* @param {String} 需要解析的ua字符串
* @param {Boolean} 是否为解析浏览器数据
* @return {Object} 解析后的对象
* @version 1.0
* 2013年9月27日13:36:47
*/ function _parse(rule, ua, isBrowser) {
var item = {},
name,
versionSearch,
flags,
versionNames,
i,
is,
ic,
j,
js,
jc; if (isBrowser && ieVer) {
return {
name: 'ie',
ie: !0,
version: ieVer,
isIe: !0
};
} for (i = 0, is = rule.length; i < is; i++) {
ic = rule[i];
name = ic.name;
versionSearch = ic.versionSearch;
flags = ic.flags;
versionNames = ic.versionNames;
if (ua.indexOf(name) !== -1) {
item.name = name.replace(/\s/g, '');
if (ic.slugName) {
item.name = ic.slugName;
}
item['is' + _upperCase1st(item.name)] = !0;
item.version = ('' + (new RegExp(versionSearch + '(\\d+((\\.|_)\\d+)*)').exec(ua) || [, 0])[1]).replace(/_/g, '.');
if (flags) {
for (j = 0, js = flags.length; j < js; j++) {
item['is' + _upperCase1st(flags[j])] = !0;
}
}
if (versionNames) {
for (j = 0, js = versionNames.length; j < js; j++) {
jc = versionNames[j];
if (item.version.indexOf(jc.number) === 0) {
item.fullname = jc.name;
item['is' + _upperCase1st(item.fullname)] = !0;
break;
}
}
}
if (rule === parseRule.platforms) {
item.isMobile = /mobile|phone/.test(ua) || item.isBlackberry;
item.isMobile = item.isMobile === undefined ? !1 : !0; item.isTablet = /tablet/.test(ua) || item.isIpad || (item.isAndroid && !/mobile/.test(ua));
item.isTablet = item.isTablet === undefined ? !1 : !0; if (item.isTablet) item.isMobile = !1; item.isDesktop = !item.isMobile && !item.isTablet ? !0 : !1; if (item.ios) {
item.fullname = 'ios' + parseInt(item.version, 10);
item['is' + _upperCase1st(item.fullname)] = !0;
}
}
break;
}
}
if (!item.name) {
item.isUnknown = !0;
item.name = '';
item.version = '';
}
return item;
} // 大写第一个字母 function _upperCase1st(string) {
return string.replace(/^(\w)/, function(w) {
return w.toUpperCase();
});
} // 测试mime function _mime(where, value, name, nameReg) {
var mimeTypes = win.navigator.mimeTypes,
i; for (i in mimeTypes) {
if (mimeTypes[i][where] == value) {
if (name !== undefined && nameReg.test(mimeTypes[i][name])) return !0;
else if (name === undefined) return !0;
}
}
return !1;
} /**
* 获取 Chromium 内核浏览器类型
* @link http://www.adtchrome.com/js/help.js
* @link https://ext.chrome.360.cn/webstore
* @link https://ext.se.360.cn
* @return {String}
* 360ee 360极速浏览器
* 360se 360安全浏览器
* sougou 搜狗浏览器
* liebao 猎豹浏览器
* chrome 谷歌浏览器
* '' 无法判断
* @version 1.0
* 2014年3月12日20:39:55
*/ function _getChromiumType() {
if (isIe || win.scrollMaxX !== undefined) return ''; var isOriginalChrome = _mime('type', 'application/vnd.chromium.remoting-viewer'); // 原始 chrome
if (isOriginalChrome) {
return 'chrome';
}
// 谷歌、火狐、ie的某些版本也有 window.chrome 属性
// 需先排除
else if ( win.chrome) {
var _track = 'track' in doc.createElement('track'),
_style = 'scoped' in doc.createElement('style'),
_v8locale = 'v8Locale' in win,
external = win.external; // 搜狗浏览器
if ( external && 'SEVersion' in external) return 'sougou'; // 猎豹浏览器
if ( external && 'LiebaoGetVersion' in external) return 'liebao'; // 360极速浏览器
if (_track && !_style && !_v8locale && /Gecko\)\s+Chrome/.test(appVersion)) return '360ee'; // 360安全浏览器
if (_track && _style && _v8locale) return '360se'; return 'other chrome';
}
return '';
} // 获得ie浏览器版本 function _getIeVersion() {
var v = 3,
p = doc.createElement('p'),
all = p.getElementsByTagName('i');
while (
p.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]);
return v > 4 ? v : 0;
} // 解析规则 function _getRules() {
return {
platforms: [
// windows phone
{
name: 'windows phone',
versionSearch: 'windows phone os ',
versionNames: [ // windows phone must be tested before win
{
number: '7.5',
name: 'mango'
}
]
},
// windows
{
name: 'win',
slugName: 'windows',
versionSearch: 'windows(?: nt)? ',
versionNames: [{
number: '6.2',
name: 'windows 8'
}, {
number: '6.1',
name: 'windows 7'
}, {
number: '6.0',
name: 'windows vista'
}, {
number: '5.2',
name: 'windows xp'
}, {
number: '5.1',
name: 'windows xp'
}, {
number: '5.0',
name: 'windows 2000'
}]
},
// ipad
{
name: 'ipad',
versionSearch: 'cpu os ',
flags: ['ios']
},
// ipad and ipod must be tested before iphone
{
name: 'ipod',
versionSearch: 'iphone os ',
flags: ['ios']
},
// iphone
{
name: 'iphone',
versionSearch: 'iphone os ',
flags: ['ios']
},
// iphone must be tested before mac
{
name: 'mac',
versionSearch: 'os x ',
versionNames: [{
number: '10.8',
name: 'mountainlion'
}, {
number: '10.7',
name: 'lion'
}, {
number: '10.6',
name: 'snowleopard'
}, {
number: '10.5',
name: 'leopard'
}, {
number: '10.4',
name: 'tiger'
}, {
number: '10.3',
name: 'panther'
}, {
number: '10.2',
name: 'jaguar'
}, {
number: '10.1',
name: 'puma'
}, {
number: '10.0',
name: 'cheetah'
}]
},
// android
{
name: 'android',
versionSearch: 'android ',
versionNames: [
// android must be tested before linux
{
number: '4.1',
name: 'jellybean'
}, {
number: '4.0',
name: 'icecream sandwich'
}, {
number: '3.',
name: 'honey comb'
}, {
number: '2.3',
name: 'ginger bread'
}, {
number: '2.2',
name: 'froyo'
}, {
number: '2.',
name: 'eclair'
}, {
number: '1.6',
name: 'donut'
}, {
number: '1.5',
name: 'cupcake'
}
]
},
// blackberry
{
name: 'blackberry',
versionSearch: '(?:blackberry\\d{4}[a-z]?|version)/'
},
// blackberry
{
name: 'bb',
slugName: 'blackberry',
versionSearch: '(?:version)/'
},
// blackberry
{
name: 'playbook',
slugName: 'blackberry',
versionSearch: '(?:version)/'
},
// linux
{
name: 'linux'
},
// nokia
{
name: 'nokia'
}
],
browsers: [{
name: 'iemobile',
versionSearch: 'iemobile/'
}, // iemobile must be tested before msie
{
name: 'msie',
slugName: 'ie',
versionSearch: 'msie '
}, {
name: 'firefox',
versionSearch: 'firefox/'
}, {
name: 'chrome',
versionSearch: 'chrome/'
}, // chrome must be tested before safari
{
name: 'safari',
versionSearch: '(?:browser|version)/'
}, {
name: 'opera',
versionSearch: 'version/'
}
],
engines: [{
name: 'trident',
versionSearch: 'trident/'
}, {
name: 'webkit',
versionSearch: 'webkit/'
}, // webkit must be tested before gecko
{
name: 'gecko',
versionSearch: 'rv:'
}, {
name: 'presto',
versionSearch: 'presto/'
}
]
};
}
};
判断浏览器 插件 jquery.ua.js的更多相关文章
- jQuery响应式幻灯片插件jquery.glide.js(支持触摸&轻量级)
		
找到一款好的幻灯片插件不容易,找到一款功能全并且使用很简单的幻灯片更不容易,今天为大家分享一款全能的幻灯片插件glide.js,也是我现在在使用的一款插件. jquery.glide.js是响应和触摸 ...
 - 基于jQuery开发的手风琴插件 jquery.accordion.js
		
1.插件代码 少说多做,基于jQuery的手风琴插件jquery.accordion.js的代码: /* * 手风琴插件说明: * 1.treeTrunk对应树干 * 2.treeLeaf对应树叶 ...
 - jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明
		
jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明 jquery.lazyload.js是一个用JavaScript编写的jQuery插件.它可以延迟加载长页面中的图片 ...
 - jQuery懒加载插件jquery.lazyload.js使用说明实例
		
jQuery懒加载插件jquery.lazyload.js使用说明实例很多网站都会用到‘图片懒加载’这种方式对网站进行优化,即延迟加载图片或符合某些条件才开始加载图片.懒加载原理:浏览器会自动对页面中 ...
 - 动态生成二维码插件  jquery.qrcode.js
		
前段时间做项目,需要动态生成一个二维码,于是就在网上找了一下发现一个jquery插件jquery.qrcode.js,所以今天就简单说一下这个插件的使用: jquery.qrcode.js是依赖jqu ...
 - jquery插件jquery.LightBox.js之点击放大图片并左右点击切换图片(仿相册插件)
		
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的点击放大图片并左右点击切换图片的效果,您可以根据自己的实 ...
 - jQuery插件 -- 表单验证插件jquery.validate.js, jquery.metadata.js
		
原文地址:http://blog.csdn.net/zzq58157383/article/details/7718352 最常使用JavaScript的场合就是表单的验证,而jQuery作为一个 ...
 - jQuery滚动条插件 – jquery.slimscroll.js
		
jquery.slimscroll.js插件是一个支持把内容放在一个盒子里面,固定一个高度,超出的则使用滚动.jquery.slimscroll.js不仅可以定义高度.宽度,还可以定义位置.滚动条大小 ...
 - 会跳高的字体插件jquery.beattext.js
		
插件描述:字体特效,会弹跳的字体插件jquery.beattext.js,兼容性如下: 使用方法 导入如下3个js文件: <script type="text/javascript&q ...
 
随机推荐
- GO学习笔记 - 包内首字母大写的名称是被导出的,才能被其它包代码调用!
			
在GO语言的任意包内,如果名称的首字母是大写的,意味着这个名称被导出,在其它包中可以使用“包名.名称”方式来调用,如果名称首字母不是大写,那么只能在这个包内部使用!这个概念还真是和以往接触的编程语言的 ...
 - kali linux之steghide
			
Steghide Linux 命令行隐写工具 Steghide是一款开源的隐写术软件,它可以让你在一张图片或者音频文件中隐藏你的秘密信息,而且你不会注意到图片或音频文件发生了任何的改变.而且,你的秘 ...
 - Python简单登录密码比对
			
# 源于Github的一段源码,编写的比较规范,应该是专业选手! # encoding:utf-8 __author__ = 'www.yeayee.com' # 由本站增加注释,可随意Fork.Co ...
 - 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列
			
一. deque(双端队列) 1. 使用 deque(maxlen=N)会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉 >>> from c ...
 - linux安装scala环境
			
(安装scala的前提是已经安装好了jdk) 1.下载scala的安装包 wget https://scala-lang.org/files/archive/scala-2.11.0-M2.tgz 2 ...
 - 深度解析CNN
			
[1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之:CNN卷积神经网络推导和实现 [4]Deep Learning模型之:CNN的反 ...
 - LLDB 和Chisel 使用例子
			
打印变量 打印数字 (lldb) p/d 16 16 16 进制格式 (lldb) p/x 16 0x10 2 进制格式 (lldb) p/t 16 0b00000000000000000000000 ...
 - Eclipse署动态web项目方法
			
和MyEclipse不一样,在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse ...
 - iOS --UIScrollView的学习(三)自动轮播
			
1.前面两章讲的都是基本的用法,这次讲一下比较重要的功能分页和自动播放 2.UIPageControl--分页 2.1只要将UIScrollView的pageEnabled属性设置为YES,UIScr ...
 - P4383 [八省联考2018]林克卡特树lct
			
题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...