判断浏览器 插件

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的更多相关文章

  1. jQuery响应式幻灯片插件jquery.glide.js(支持触摸&轻量级)

    找到一款好的幻灯片插件不容易,找到一款功能全并且使用很简单的幻灯片更不容易,今天为大家分享一款全能的幻灯片插件glide.js,也是我现在在使用的一款插件. jquery.glide.js是响应和触摸 ...

  2. 基于jQuery开发的手风琴插件 jquery.accordion.js

     1.插件代码 少说多做,基于jQuery的手风琴插件jquery.accordion.js的代码:  /* * 手风琴插件说明: * 1.treeTrunk对应树干 * 2.treeLeaf对应树叶 ...

  3. jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明

    jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明 jquery.lazyload.js是一个用JavaScript编写的jQuery插件.它可以延迟加载长页面中的图片 ...

  4. jQuery懒加载插件jquery.lazyload.js使用说明实例

    jQuery懒加载插件jquery.lazyload.js使用说明实例很多网站都会用到‘图片懒加载’这种方式对网站进行优化,即延迟加载图片或符合某些条件才开始加载图片.懒加载原理:浏览器会自动对页面中 ...

  5. 动态生成二维码插件 jquery.qrcode.js

    前段时间做项目,需要动态生成一个二维码,于是就在网上找了一下发现一个jquery插件jquery.qrcode.js,所以今天就简单说一下这个插件的使用: jquery.qrcode.js是依赖jqu ...

  6. jquery插件jquery.LightBox.js之点击放大图片并左右点击切换图片(仿相册插件)

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的点击放大图片并左右点击切换图片的效果,您可以根据自己的实 ...

  7. jQuery插件 -- 表单验证插件jquery.validate.js, jquery.metadata.js

    原文地址:http://blog.csdn.net/zzq58157383/article/details/7718352   最常使用JavaScript的场合就是表单的验证,而jQuery作为一个 ...

  8. jQuery滚动条插件 – jquery.slimscroll.js

    jquery.slimscroll.js插件是一个支持把内容放在一个盒子里面,固定一个高度,超出的则使用滚动.jquery.slimscroll.js不仅可以定义高度.宽度,还可以定义位置.滚动条大小 ...

  9. 会跳高的字体插件jquery.beattext.js

    插件描述:字体特效,会弹跳的字体插件jquery.beattext.js,兼容性如下: 使用方法 导入如下3个js文件: <script type="text/javascript&q ...

随机推荐

  1. 重装SQL前,一定要把SQL2005、SQL2008之类的彻底删除干净

    0.预备 如果你曾删除过VS2010或者VS2008之类的,同理也要照此方法删除 1.步骤,顺序无妨 卸载程序:控制面板---查找SQL..NET   删除干净 停掉SQL的所有服务:  计算机--管 ...

  2. django系列3.1--url路由配置, 正则, 分发include, 分组命名匹配

    一.url配置 在django项目中urls.py文件中就是为这个url调用的view(视图)函数之间的映射表,来配置访问的一个url执行什么代码 默认的基本格式: from django.conf. ...

  3. 动态代理(JDK实现)

    JDK动态代理,针对目标对象的接口进行代理 ,动态生成接口的实现类 !(必须有接口) public class ProxyDemo { //通过方法的返回值得到代理对象            方法参数 ...

  4. docker微服务部署之:二、搭建文章微服务项目

    docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...

  5. 前端知识总结--js原型链

    js的原型链听着比较深奥,看着容易晕,梳理一下还是比较容易懂的 (先简单写下,后续有时间再整理) 简而言之 原型链:就是js的对象与对象之间,通过原型组成建立的层层关系,构成了整个链条,称之为原型链  ...

  6. [BZOJ 5155][Tjoi2014]电源插排

    传送门 网上大部分题解都写得是动态开点线段树,然而像\(MiEcoku\)这么懒惰的显然不会去写线段树... \(\color{green}{solution}\) 我们考虑来点骚操作. 线段树维护的 ...

  7. 皕杰报表 javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

    今天做报表的时候,跳转到显示报表页面的时候不出来数据,报错说数据集未产生. 后台报错 javax.naming.NameNotFoundException: Name jdbc is not boun ...

  8. 题解 p2420 让我们异或吧

    传送门 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ;in ...

  9. FZU_1894 志愿者选拔 【单调队列】

    1 题面 FZU1894 2 分析 单调队列的典型引用 需要注意的是在用维护辅助队列的时候,$L$和$R$的初始化都是0时,队列第一个数就是$L$,最后一个数就是$R-1$. 3 AC代码 #incl ...

  10. jenkins backup and migration

    service jenkins stop 压缩包:tar -czvf /tmp/xx.tar.gz --exclude=“workspace” --exclude=“.m2" --exclu ...