const ChinaIdChecker = function(id) { this.isOK = false; this.error = ''; if (!id || typeof (id) != 'string' || id.length != 15 && id.length != 18 || !id.match(/^[0-9]{15}$/) && !id.match(/^[0-9]{17}[0-9xX]$/) || "111111111111111" == id) { this.error = '输入不是15位或者18位有效字符串'; return false; } let area = { 11 : "北京", 12 : "天津", 13 : "河北", 14 : "山西", 15 : "内蒙古", 21 : "辽宁", 22 : "吉林", 23 : "黑龙江", 31 : "上海", 32 : "江苏", 33 : "浙江", 34 : "安徽", 35 : "福建", 36 : "江西", 37 : "山东", 41 : "河南", 42 : "湖北", 43 : "湖南", 44 : "广东", 45 : "广西", 46 : "海南", 50 : "重庆", 51 : "四川", 52 : "贵州", 53 : "云南", 54 : "西藏", 61 : "陕西", 62 : "甘肃", 63 : "青海", 64 : "宁夏", 65 : "新疆", 71 : "台湾", 81 : "香港", 82 : "澳门", 91 : "国外" }; this.areaName = area[id.substr(0, 2)]; if (!this.areaName) { this.error = '前2位不是有效的行政区划代码'; return false; } if (id.length === 15) { this.year = parseInt(id.substr(6, 2)); this.month = parseInt(id.substr(8, 2)); this.day = parseInt(id.substr(10, 2)); } else { this.year = parseInt(id.substr(6, 4)); this.month = parseInt(id.substr(10, 2)); this.day = parseInt(id.substr(12, 2)); } this.error = '出生日期不正确'; if (this.month > 12) { return false; } if (this.day > 31) { return false; } // February can't be greater than 29 (leap year calculation comes later) if ((this.month == 2) && (this.day > 29)) { return false; } // check for months with only 30 days if ((this.month == 4) || (this.month == 6) || (this.month == 9) || (this.month == 11)) { if (this.day > 30) { return false; } } // if 2-digit year, use 50 as a pivot date if (this.year < 100) { this.year += 1900; } if (this.year > 9999) { return false; } // check for leap year if the month and day is Feb 29 if ((this.month == 2) && (this.day == 29)) { var div4 = this.year % 4; var div100 = this.year % 100; var div400 = this.year % 400; // if not divisible by 4, then not a leap year so Feb 29 is invalid if (div4 != 0) { return false; } // at this point, year is divisible by 4. So if year is divisible by // 100 and not 400, then it's not a leap year so Feb 29 is invalid if ((div100 == 0) && (div400 != 0)) { return false; } } this.yearStr = '' + this.year; this.monthStr = (this.month < 10 ? '0' : '') + this.month; this.dayStr = (this.day < 10 ? '0' : '') + this.day; // date is valid var birthDay = new Date(this.year, this.month - 1, this.day); if (birthDay - new Date() >= 0 || birthDay - new Date(1850, 1, 1) <= 0) { return false; } this.error = ''; var lastNum = id.length == '15' ? id.substr(14, 1) : id.substr(16, 1); this.sex = (lastNum == '1' || lastNum == '3' || lastNum == '5' || lastNum == '7' || lastNum == '9') ? '1' : '0'; this.sexName = this.sex == '1' ? '男' : '女'; if (id.length == '15') { this.isOK = true; return true; } let getLastValidationLetter = function(str) { var strArray = new Array(17); // 存储身份证的前17为数字 var Wi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1); // 表示第i位置上的加权因子 var Y = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2','x'); // 校验码值 var S = 0; // 十七位数字本体码加权求和 var jym = 0; // 校验码 for ( var i = 16; i >= 0; i -= 1) { strArray[i] = Number(str.charAt(i)); } for ( var j = 16; j >= 0; j -= 1) { S += strArray[j] * Wi[j]; } jym = S % 11; return Y[jym]; }; if (id.substr(17, 1) != getLastValidationLetter(id.substr(0, 17))) { this.error = '18位身份证编码最后一位校验码不正确'; return false; } this.isOK = true; return true; };
js验证身份证合法
最新推荐文章于 2023-11-08 00:05:05 发布