/**
* @param {Function} ios回调
* @param {Function} Android回调
* @description 识别设备终端类型执行回调
*/
function dealDeviceCallback (iosFn, adrFn) {
var UA = navigator.userAgent;
var android = UA.indexOf('Android') > -1 || UA.indexOf('Adr') > -1;
var iOS = !!UA.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);
if (iOS) {
iosFn();
}
if (android) {
adrFn();
}
}
/**
* @description 获取路径参数
* @returns {Object}
*/
function getUrlParams () {
var url = decodeURIComponent(window.location.toString());
var arrObj = url.split('?');
var params = Object.create(null);
if (arrObj.length > 1) {
arrObj = arrObj[1].split('&');
arrObj.forEach(function (item) {
item = item.split('=');
params[item[0]] = item[1]
})
}
return params;
}
/**
* @param {Array} arr 传入的数组对象
* @param {Function} fn 回调函数 支持传入三个参数 遍历的元素item, 下标 i, 原始数组对象 arr
* @description 自定义遍历 回调处理
*/
function mkForEach(arr, fn) {
if (!arr || !arr.length) return;
var i = -1;
var len = arr.length;
while (++i < len) {
var item = arr[i];
fn (item, i, arr)
}
}
/**
*
* @param {Array} arr1
* @param {Array} arr2
* @description 得到两个数组的交集,数组的元素为数值或字符串
* @returns {Array}
*/
function getIntersection (arr1, arr2) {
var len = Math.min(arr1.length, arr2.length);
var i = -1;
var res = [];
while (++i < len) {
var item = arr2[i];
if (arr1.indexOf(item) > -1) res.push(item);
}
return res;
}
/**
*
* @param {Aarray} arr1
* @param {Aarray} arr2
* @description 得到两个数组的并集,数组的元素为数值或字符串
* @returns {Array}
*/
function getUnion (arr1, arr2) {
var len = arr2.length;
var i = -1;
var res = [];
while (++i < len) {
var item = arr2[i];
if (arr1.indexOf(item) === -1) res.push(item);
}
return arr1.concat(res);
}
/**
*
* @param {Aarray} targetArr
* @param {Aarray} arr *
* @description 判断已知数组是否至少有一个元素包含在目标数组内
*/
function hasOneOf (targetArr, arr) {
return targetArr.some(_ => arr.indexOf(_) > -1);
}
/**
* @description 检查数据是否是非数字值 原生的isNaN 会把参数转化成数字(valueof)。
* 且null, true, false以及长度小于等于1的数组(元素为非NaN的数据).
* Symbol不具有valueof接口,所以isNaN会抛出错误。这里放在最后避免出错。
* @returns {Boolean}
*/
function mkIsNaN (v) {
return !(typeof v === 'string' || typeof v === 'number') || isNaN(v)
}
/**
*
* @param {Array} arr
* @description 返回数组中非NaN数据中的最大值
* @returns Max
*/
function mkMax (arr) {
arr = arr.filter(function (item) {
return !mkIsNaN(item)
});
return arr.length ? Math.max.apply(null, arr) : undefined;
}
/**
*
* @param {Array} arr
* @description 返回数组中非NaN数据中的最小值
* @returns Min
*/
function mkMin (arr) {
arr = arr.filter(function (item) {
return !mkIsNaN(item)
});
return arr.length ? Math.min.apply(null, arr) : undefined;
}
/**
*
* @param {Number} lower
* @param {Number} Upper
* @description 返回一个lower - upper 之间的随机数
* @returns {Number}
*/
function mkRandom (lower, upper) {
lower = +lower || 0;
upper = +upper || 0;
return Math.random() * (upper - lower) + lower;
}
/**
* @param {Number} timeStamp 时间戳
* @description 判断当前时间戳是否为毫秒级
* @returns {Boolean}
*/
function isMillisecond (timeStamp) {
var timeStr = timeStamp.toString();
return timeStr.length > 10;
}
/**
* @param {Number} timeStamp 对比时间戳
* @param {Number} currentTime 当前时间戳
* @returns {Boolean} 是否比当前时间早
*/
function isEarly (timeStamp, currentTime) {
return timeStamp < currentTime
}
/**
* @param {Number} num 数值
* @returns {String} 处理后的字符串
* @description 如果传入的数值小于10, 则在前面补充0
*/
function singleToDouble (num) {
return num < 10 ? '0' + num : num;
}
/**
* @description 时间戳格式化处理 这种方法参数少 凡是对与第一个参数的限制提高了,不需要符合相应的格式
* @param {String} formatter 时间格式
* @param {Number} timeStamp 时间戳 不传则取系统当前时间
* @returns {String}
*/
function formatterDateReg (formatter, timeStamp) {
timeStamp = timeStamp || new Date().getTime();
var _d = isMillisecond(timeStamp) ? new Date(timeStamp) : new Date(timeStamp * 1000);
var Y = _d.getFullYear() + '';
var M = singleToDouble(_d.getMonth() + 1);
var D = singleToDouble(_d.getDate());
var H = singleToDouble(_d.getHours());
var m = singleToDouble(_d.getMinutes());
var s = singleToDouble(_d.getSeconds());
return formatter.replace(/YYYY|yyyy/g, Y)
.replace(/YY|yy/g, Y.substr(2,2))
.replace(/MM/g, M)
.replace(/DD/g, D)
.replace(/HH|hh/g, H)
.replace(/mm/g, m)
.replace(/ss/g, s)
}
/**
* Convert a base64 string in a Blob according to the data and contentType.
*
* @param {String} b64Data Pure base64 string without contentType
* @param {String} contentType the content type of the file i.e (image/jpeg - image/png - text/plain)
* @param {Int} sliceSize SliceSize to process the byteCharacters
* @see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript
* @returns Blob
*/
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
/**
* @param {String} imgUrl 原始base64字符串 带有文件类型信息
* @param {String} fileName 转成File对象之后的文件名
* @description base64 对象转File 对象 (中间必须要先转为blob对象)
*/
function b64ToFile (imgUrl, fileName) {
fileName = fileName || 'file' + parseInt(mkRandom(1, (new Date().getTime() / 1000)));
var block = imgUrl.split(';');
var contentType = block[0].split(':')[1];
var realData = block[1].split(',')[1];
var blobObj = b64toBlob(realData, contentType);
var fileObj = new File([blobObj], fileName + '.' + contentType.split('/')[1]);
return fileObj;
}
/**
*
* @param {Number} num
* @description 这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。
*/
function isIdCardNo(num) {
num = num.toUpperCase();
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if (!(/(^d{15}$)|(^d{17}([0-9]|X|x)$)/.test(num))) {
// alert('输入的身份证号长度不对,或者号码不符合规定!
15位号码应全为数字,18位号码末位可以为数字或X。');
return false;
}
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
//下面分别分析出生日期和校验位
var len, re;
len = num.length;
if (len == 15) {
re = new RegExp(/^(d{6})(d{2})(d{2})(d{2})(d{3})$/);
var arrSplit = num.match(re);
//检查生日日期是否正确
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2]))
&& ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
&& (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
// alert('输入的身份证号里出生日期不对!');
return false;
} else {
//将15位身份证转成18位
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
'3', '2');
var nTemp = 0, i;
num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
for (i = 0; i < 17; i++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
num += arrCh[nTemp % 11];
return num;
}
}
if (len == 18) {
re = new RegExp(/^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X|x)$/);
var arrSplit = num.match(re);
//检查生日日期是否正确
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/"
+ arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2]))
&& ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
&& (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) {
// alert(dtmBirth.getYear());
// alert(arrSplit[2]);
// alert('输入的身份证号里出生日期不对!');
return false;
} else {
//检验18位身份证的校验码是否正确。
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
'3', '2');
var nTemp = 0, i;
for (i = 0; i < 17; i++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)) {
// alert('18位身份证的校验码不正确!应该为:' + valnum);
return false;
}
return num;
}
}
return false;
}
1 /**
2 *
3 * @param {String} v1 当前版本号
4 * @param {String} v2 对比参照版本号
5 */
6 function compareVersion (v1, v2) {
7 v1 = v1.split('.')
8 v2 = v2.split('.')
9 var len = Math.max(v1.length, v2.length);
10 while (v1.length < len) {
11 v1.push('0')
12 }
13 while (v2.length < len) {
14 v2.push('0')
15 }
16 for (var i = 0; i < len; i++) {
17 var num1 = parseInt(v1[i]);
18 var num2 = parseInt(v2[i]);
19
20 if (num1 > num2) {
21 return 1
22 } else if (num1 < num2) {
23 return -1
24 }
25 }
26 return 0
27 }
// 判断设备系统类型
function checkSystem () {
var u = navigator.userAgent
var browserVersion = (function () {
return {
ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1 //是否iPad
}
})()
var isIOS = (function () {
if (browserVersion.ios || browserVersion.iPhone || browserVersion.iPad) {
return true
} else {
return false
}
})()
var isAndroid = (function () {
return browserVersion.android
})()
return {
iOS: isIOS,
Android: isAndroid
}
}