判断浏览器 插件 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 ...
随机推荐
- ASP.NET Core使用Ping判断网络是否接通
static void Main(string[] args) { // 主机地址 string targetHost = "bing.com"; string data = &q ...
- openstack 的 lbaas 疑问
1 为什么lbaas的haproxy实现没有将其放到vrouter中,而vpnaas/fwaas都放到vrouter中呢? 放在vrouter上,可以减少vrouter到haproxy的流量路径,是怕 ...
- python--区分函数和方法, 反射
1. isinstance, type, issubclass isinstance(): 判断你给的xxx对象是否是xxxxx类型的,只支持向上判断 isinstance(object, ...
- shell、cmd、dos和脚本语言区别和联系
问题一:DOS与windows中cmd区别 在windows系统中,“开始-运行-cmd”可以打开“cmd.exe”,进行命令行操作. 操作系统可以分成核心(kernel)和Shell(外壳)两部 ...
- Problem H: 小姐姐的QQ号(DFS)
Contest - 河南省多校连萌(四) Problem H: 小姐姐的QQ号 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 297 Solved: ...
- [Objective-C语言教程]错误处理(22)
在Objective-C编程中,错误处理由Foundation框架中提供的NSError类提供处理. 与仅使用错误代码或错误字符串相比,NSError对象封装了更丰富且更具可扩展性的错误信息. NSE ...
- web渗透-sqli-labs-master 下载与安装
注意事项,写在前面. php版本一定要设置成 7 以下,7之后的mysql_都改成了mysqli_**了,用7以上版本的话会报错 *********************************** ...
- 利用wxpy进行微信信息发送详解(一)
利用wxpy进行微信信息自动发送,简直是骚扰神器,除非拉黑你. 那我们就来设置一个场景吧,五秒发送一次,一次发送10条 首先我们来整理一下思路: ♦1.首先我们要从网上爬去我们想要发送的内容 ♦2.登 ...
- day 09 课后作业
# -*- coding: utf-8 -*-# @Time : 2018/12/28 14:25# @Author : Endless-cloud# @Site : # @File : 08 课后作 ...
- 10分钟教你用Python打造微信天气预报机器人
01 前言 最近武汉的天气越来越恶劣了.动不动就下雨,所以,拥有一款好的天气预报工具,对于我们大学生来说,还真是挺重要的了.好了,自己动手,丰衣足食,我们来用Python打造一个天气预报的微信机器人吧 ...