判断浏览器 插件

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. Android中Textview显示Html,图文混排,支持图片点击放大

    本文首发于网易云社区 对于呈现Html文本来说,Android提供的Webview控件可以得到很好的效果,但使用Webview控件的弊端是效率相对比较低,对于呈现简单的html文本的话,杀鸡不必使用牛 ...

  2. WPF INotifyPropertyChanged 通过特性减少代码量

    在很多地方需要用上INotifyPropertyChanged的接口,MVVM模式,List等集合都会用到. 通常我们使用 protected void OnChange(PropertyChange ...

  3. JAVA日期——java.util.date类的操作

    package com.hxzy.time; import java.text.SimpleDateFormat;import java.util.Date; public class DateDem ...

  4. robot framework学习笔记之一 资源文件(Resource)和外部资源(External Resources)

    一.资源文件(Resource) 测试套件主要是存放测试案例,资源文件主要是用来存放用户关键字. 添加资源    在目录型的Project/Test Suite下单击鼠标右键,选择『New Resou ...

  5. USB-Redirector-Technician 永久破解版(USB设备映射软件)

    USB-Redirector-Technician 这个软件对于搞安卓刷机的人想必非常熟悉,淘宝破解版售价:38 一个的东西 除了远程刷机,用于映射一些小型设备是没问题的,只要网跟得上~ USB-Re ...

  6. 安装zlib的过程(Compression requires the (missing) zlib module)(Python2.6升级为2.7出现的问题)

    觉得有必要把解决问题的过程写下来 1,因为要安装flask,所以安装pip,所以安装setuptools,所以安装zlib.(具体过程http://www.cnblogs.com/aiyr/p/726 ...

  7. 干货 | Elasticsearch Nested类型深入详解(转)

    https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...

  8. 【性能分析】使用Intel VTune Amplifier

    本文转自 https://software.intel.com/zh-cn/blogs/2010/11/10/amplxe-cl/版权归原作者所有,如原作者有任何不允许转载之理由,本文将自行删除. I ...

  9. set,env和export命令显示shell变量其区别,与环境变量扫盲(一)

    种类: ♦ set     :  用来显示本地变量,显示当前shell的变量,包括当前用户的变量 ♦ env    :  用来显示环境变量,显示当前用户的变量. ♦ export:  用来显示和设置环 ...

  10. 【ASP.NET】DataTable导出EXCEL,弹窗提示下载保存(完整代码)

    //新建ASPX protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); Data ...