/** * @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(‘输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,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 { trident: u.indexOf(‘Trident‘) > -1, //IE内核 presto: u.indexOf(‘Presto‘) > -1, //opera内核 webKit: u.indexOf(‘AppleWebKit‘) > -1, //苹果、谷歌内核 gecko: u.indexOf(‘Gecko‘) > -1 && u.indexOf(‘KHTML‘) == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端 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 webApp: u.indexOf(‘Safari‘) == -1 //是否web应该程序,没有头部与底部 } })() 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 } }
原文:https://www.cnblogs.com/matthewkuo24/p/14060449.html