cloud-symbol
Version:
123
311 lines (292 loc) • 8.38 kB
JavaScript
//此组件提供特殊表单校验功能
//01.校验身份证输入是否正确
/**
*
* @param {Number || String} value 身份证
* @returns 校验通过返回TRUE 否则 返回FALSE
*/
function idCard(value) {
// 加权因子
var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 校验码
var check_code = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
var code = value + "";
var last = value[17]; //最后一位
var seventeen = code.substring(0, 17);
// ISO 7064:1983.MOD 11-2
// 判断最后一位校验码是否正确
var arr = seventeen.split("");
var len = arr.length;
var num = 0;
for (var i = 0; i < len; i++) {
num = num + arr[i] * weight_factor[i];
}
// 获取余数
var resisue = num % 11;
var last_no = check_code[resisue];
// 格式的正则
// 正则思路
/*
第一位不可能是0
第二位到第六位可以是0-9
第七位到第十位是年份,所以七八位为19或者20
十一位和十二位是月份,这两位是01-12之间的数值
十三位和十四位是日期,是从01-31之间的数值
十五,十六,十七都是数字0-9
十八位可能是数字0-9,也可能是X
*/
var idcard_patter =
/^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;
// 判断格式是否正确
var format = idcard_patter.test(value);
// 返回验证结果,校验码和格式同时正确才算是合法的身份证号码
return last === last_no && format ? true : false;
}
//02 校验手机号是否正确
/**
*
* @param {Number || String} mobile 手机号
* @returns 校验通过返回TRUE 否则 返回FALSE
*/
function mobile(mobile) {
var reg = /^[1][3,4,5,7,8,9][0-9]{9}$/;
return reg.test(mobile);
}
// 03 通过身份证获取年龄
/**
*
* @param {Number || String}} value 身份证
* @returns 返回格式 YYYY-MM-DD 如 1999-05-01
*/
function birthday(value) {
var birthday = "";
if (value != null && value != "") {
if (value.length == 15) {
birthday = "19" + value.substr(6, 6);
} else if (value.length == 18) {
birthday = value.substr(6, 8);
}
birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-");
}
return birthday;
}
//04 通过身份证获取年龄
/**
*
* @param {Number || String} value 身份证
* @returns 返回 身份证中年龄 如 22
*/
function age(value) {
var myDate = new Date();
var month = myDate.getMonth() + 1;
var day = myDate.getDate();
var age = myDate.getFullYear() - value.substring(6, 10) - 1;
if (
value.substring(10, 12) < month ||
(value.substring(10, 12) == month && value.substring(12, 14) <= day)
) {
age++;
}
return age;
}
//05 通过身份证获取性别
/**
*
* @param {Number || String} value 身份证
* @returns 返回 字符串 男 或 女
*/
function gender(value) {
if (parseInt(value.substr(16, 1)) % 2 == 1) {
return "男";
} else {
return "女";
}
}
//06 校验银行卡
/**
*
* @param {Number || String} value 银行卡
* @returns 校验通过返回 TRUE 否则返回 FALSE
*/
function bankCard(value) {
var lastNum = value.substr(value.length - 1, 1); //取出最后一位(与luhn进行比较)
var first15Num = value.substr(0, value.length - 1); //前15或18位
var newArr = new Array();
for (var i = first15Num.length - 1; i > -1; i--) {
//前15或18位倒序存进数组
newArr.push(first15Num.substr(i, 1));
}
var arrJiShu = new Array(); //奇数位*2的积 <9
var arrJiShu2 = new Array(); //奇数位*2的积 >9
var arrOuShu = new Array(); //偶数位数组
for (var j = 0; j < newArr.length; j++) {
if ((j + 1) % 2 == 1) {
//奇数位
if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2);
else arrJiShu2.push(parseInt(newArr[j]) * 2);
} //偶数位
else arrOuShu.push(newArr[j]);
}
var jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数
var jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数
for (var h = 0; h < arrJiShu2.length; h++) {
jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
}
var sumJiShu = 0; //奇数位*2 < 9 的数组之和
var sumOuShu = 0; //偶数位数组之和
var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
var sumTotal = 0;
for (var m = 0; m < arrJiShu.length; m++) {
sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
}
for (var n = 0; n < arrOuShu.length; n++) {
sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
}
for (var p = 0; p < jishu_child1.length; p++) {
sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);
sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);
}
//计算总和
sumTotal =
parseInt(sumJiShu) +
parseInt(sumOuShu) +
parseInt(sumJiShuChild1) +
parseInt(sumJiShuChild2);
//计算luhn值
var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
var luhn = 10 - k;
if (lastNum == luhn) {
return true;
} else {
return false;
}
}
//邮箱校验
/**
*
* @param {Number || String} value 邮箱
* @returns 校验通过返回 TRUE 否则返回 FALSE
*/
function email(value) {
var check =
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return check.test(value);
}
// 座机号校验
/**
*
* @param {Number || String} value 座机号
* @returns 校验通过返回 TRUE 否则返回 FALSE
*/
function fixedPhone(value) {
return /^\d{3,4}-\d{7,8}(-\d{3,4})?$/.test(value);
}
// 验证护照号码
/**
*
* @param {Number || String} value 护照号
* @returns 校验通过返回 TRUE 否则返回 FALSE
*/
function passport(value) {
return /^((1[45]\d{7})|(G\d{8})|(P\d{7})|(S\d{7,8}))?$/.test(value);
}
//节流函数
function throttle(fn, delay) {
// fn = test
let timerId = null;
let flag = true;
return function () {
if (!flag) return;
flag = false;
let self = this;
let args = arguments;
timerId && clearTimeout(timerId);
timerId = setTimeout(function () {
flag = true;
fn.apply(self, args);
}, delay || 1000);
};
}
//防抖函数
function debounce(fn, delay) {
let timerId = null;
return function () {
let self = this;
let args = arguments;
timerId && clearTimeout(timerId);
timerId = setTimeout(function () {
fn.apply(self, args);
}, delay || 1000);
};
}
//姓名脱敏
/**
*
* @param {String} name 姓名
* @returns 返回脱敏后的姓名 如传入 张三 => 张* 刘德华=> 刘*华 三上亚悠=> 三**悠
*/
function nameHide(name) {
if (name.length == 2) {
name = name.substring(0, 1) + "*"; //字符串截取第一个字符,
} else if (name.length == 3) {
name = name.substring(0, 1) + "*" + name.substring(2, 3); //截取第一个和第三个字符
} else if (name.length > 3) {
name = name.substring(0, 1) + "*" + "*" + name.substring(3, name.length); //截取第一个和大于第4个字符
}
return name;
}
//手机号脱敏
/**
*
* @param {Number || String} mobile 手机号
* @returns 返回脱敏后的手机号 如传入 13388888888 返回 133****8888
*/
function mobileHide(mobile) {
let pat = /(\d{3})\d*(\d{4})/;
mobile = mobile.replace(pat, "$1****$2");
return mobile;
}
//身份证脱敏
/**
*
* @param {Number || String} idCard 身份证
* @returns 返回脱敏后的身份证 如传入 370982199201303679 返回 370************679
*/
function idCardHide(idCard) {
return idCard.replace(/^(.{1})(?:\d+)(.{1})$/,
'$1****************$2');
}
//判断当前设备类型
/**
*
* @returns 返回当前设备类型 苹果 ios 安卓 android PC网页 web
*/
function getDeviceType() {
let ua = navigator.userAgent.toLowerCase()
if (ua.match(/iPhone\sOS/i) === 'iphone os' || ua.match(/iPad/i) === 'ipad') { // ios
return 'ios'
}
if (ua.match(/Android/i) === 'android') {
return 'android'
}
return 'web'
}
module.exports = {
idCard,
mobile,
birthday,
age,
gender,
bankCard,
email,
fixedPhone,
passport,
throttle,
debounce,
nameHide,
mobileHide,
idCardHide,
getDeviceType
};