直接上代码
<!DOCTYPE html><html lang="en"><head> ???<meta charset="UTF-8"> ???<title>JS严格校验身份证号</title></head><body> ???<div align="center"> ???????</br> ???????</br> ???????</br> ???????</br> ???????</br> ???????</br> ???????</br> ???????</br> ???????<div class="form-inline"> ???????????<input type="text" class="form-control" style="width: 200px;" id="idCard" placeholder="输入身份证号"> ???????????<button class="btn btn-default" onclick="check();">校验</button> ???????</div> ???</div> ???<footer class="footer"> ???????<div class="container"> ???????????<p class="text-muted" align="center">Author:<a href="http://itmyhome.com" target="_blank">麦田技术博客</a></p> ???????</div> ???</footer></body><script type="text/javascript">function check() { ???var idCard = document.getElementById("idCard").value; ???var flag = IdCardValidate(idCard); ???if (flag) { ???????alert("正确!"); ???} else { ???????alert("您输入的身份证号格式不正确 "); ???}}var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子 ??var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 身份证验证位值.10代表X ??function IdCardValidate(idCard) { ???idCard = trim(idCard.replace(/ /g, "")); //去掉字符串头尾空格 ????????????????????????if (idCard.length == 15) { ???????return isValidityBrithBy15IdCard(idCard); //进行15位身份证的验证 ???????} else if (idCard.length == 18) { ???????var a_idCard = idCard.split(""); // 得到身份证数组 ??????????if (isValidityBrithBy18IdCard(idCard) && isTrueValidateCodeBy18IdCard(a_idCard)) { //进行18位身份证的基本验证和第18位的验证 ???????????return true; ???????} else { ???????????return false; ???????} ???} else { ???????return false; ???}}/** ??* 判断身份证号码为18位时最后的验证位是否正确 ??* @param a_idCard 身份证号码数组 ??* @return ??*/function isTrueValidateCodeBy18IdCard(a_idCard) { ???var sum = 0; // 声明加权求和变量 ??????if (a_idCard[17].toLowerCase() == ‘x‘) { ???????a_idCard[17] = 10; // 将最后位为x的验证码替换为10方便后续操作 ??????} ???for (var i = 0; i < 17; i++) { ???????sum += Wi[i] * a_idCard[i]; // 加权求和 ??????} ???valCodePosition = sum % 11; // 得到验证码所位置 ??????if (a_idCard[17] == ValideCode[valCodePosition]) { ???????return true; ???} else { ???????return false; ???}}/** ??* 验证18位数身份证号码中的生日是否是有效生日 ??* @param idCard 18位书身份证字符串 ??* @return ??*/function isValidityBrithBy18IdCard(idCard18) { ???var year = idCard18.substring(6, 10); ???var month = idCard18.substring(10, 12); ???var day = idCard18.substring(12, 14); ???var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day)); ???// 这里用getFullYear()获取年份,避免千年虫问题 ??????if (temp_date.getFullYear() != parseFloat(year) || ???????temp_date.getMonth() != parseFloat(month) - 1 || ???????temp_date.getDate() != parseFloat(day)) { ???????return false; ???} else { ???????return true; ???}}/** ??* 验证15位数身份证号码中的生日是否是有效生日 ??* @param idCard15 15位书身份证字符串 ??* @return ??*/function isValidityBrithBy15IdCard(idCard15) { ???var year = idCard15.substring(6, 8); ???var month = idCard15.substring(8, 10); ???var day = idCard15.substring(10, 12); ???var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day)); ???// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 ??????if (temp_date.getYear() != parseFloat(year) || ???????temp_date.getMonth() != parseFloat(month) - 1 || ???????temp_date.getDate() != parseFloat(day)) { ???????return false; ???} else { ???????return true; ???}}//去掉字符串头尾空格 ??function trim(str) { ???return str.replace(/(^\s*)|(\s*$)/g, "");}</script></html>
JS严格校验身份证号
原文地址:https://www.cnblogs.com/chenmiaosong/p/8548537.html