IDValidate.js
1 var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子 2 var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表X 3 function IdCardValidate(idCard) { 4 idCard = trim(idCard.replace(/ /g, "")); 5 if (idCard.length == 15) { 6 return isValidityBrithBy15IdCard(idCard); 7 } else if (idCard.length == 18) { 8 var a_idCard = idCard.split("");// 得到身份证数组 9 if(isValidityBrithBy18IdCard(idCard) 10 &&isTrueValidateCodeBy18IdCard(a_idCard)){ 11 return true; 12 }else { 13 return false; 14 } 15 } else { 16 return false; 17 } 18 } 19 /** 20 * 判断身份证号码为18位时最后的验证位是否正确 21 * @param a_idCard 身份证号码数组 22 * @return 23 */ 24 function isTrueValidateCodeBy18IdCard(a_idCard) { 25 var sum = 0; // 声明加权求和变量 26 if (a_idCard[17].toLowerCase() == 'x') { 27 a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作 28 } 29 for ( var i = 0; i < 17; i++) { 30 sum += Wi[i] * a_idCard[i];// 加权求和 31 } 32 valCodePosition = sum % 11;// 得到验证码所位置 33 if (a_idCard[17] == ValideCode[valCodePosition]) { 34 return true; 35 } else { 36 return false; 37 } 38 } 39 /** 40 * 通过身份证判断是男是女 41 * @param idCard 15/18位身份证号码 42 * @return 'female'-女、'male'-男 43 */ 44 function maleOrFemalByIdCard(idCard){ 45 idCard = trim(idCard.replace(/ /g, ""));// 对身份证号码做处理。包括字符间有空格。 46 if(idCard.length==15){ 47 if(idCard.substring(14,15)%2==0){ 48 return 'female'; 49 }else{ 50 return 'male'; 51 } 52 }else if(idCard.length ==18){ 53 if(idCard.substring(14,17)%2==0){ 54 return 'female'; 55 }else{ 56 return 'male'; 57 } 58 }else{ 59 return null; 60 } 61 // 可对传入字符直接当作数组来处理 62 // if(idCard.length==15){ 63 // alert(idCard[13]); 64 // if(idCard[13]%2==0){ 65 // return 'female'; 66 // }else{ 67 // return 'male'; 68 // } 69 // }else if(idCard.length==18){ 70 // alert(idCard[16]); 71 // if(idCard[16]%2==0){ 72 // return 'female'; 73 // }else{ 74 // return 'male'; 75 // } 76 // }else{ 77 // return null; 78 // } 79 } 80 /** 81 * 验证18位数身份证号码中的生日是否是有效生日 82 * @param idCard 18位书身份证字符串 83 * @return 84 */ 85 function isValidityBrithBy18IdCard(idCard18){ 86 var year = idCard18.substring(6,10); 87 var month = idCard18.substring(10,12); 88 var day = idCard18.substring(12,14); 89 var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 90 // 这里用getFullYear()获取年份,避免千年虫问题 91 if(temp_date.getFullYear()!=parseFloat(year) 92 ||temp_date.getMonth()!=parseFloat(month)-1 93 ||temp_date.getDate()!=parseFloat(day)){ 94 return false; 95 }else{ 96 return true; 97 } 98 } 99 /** 100 * 验证15位数身份证号码中的生日是否是有效生日 101 * @param idCard15 15位书身份证字符串 102 * @return 103 */ 104 function isValidityBrithBy15IdCard(idCard15){ 105 var year = idCard15.substring(6,8); 106 var month = idCard15.substring(8,10); 107 var day = idCard15.substring(10,12); 108 var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 109 // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 110 if(temp_date.getYear()!=parseFloat(year) 111 ||temp_date.getMonth()!=parseFloat(month)-1 112 ||temp_date.getDate()!=parseFloat(day)){ 113 return false; 114 }else{ 115 return true; 116 } 117 } 118 119 //去掉字符串头尾空格 120 function trim(str) { 121 return str.replace(/(^\s*)|(\s*$)/g, ""); 122 } 123 124 125 function showBirthdayAndSex(idCard,sexId,birhId) 126 { 127 var birthdayValue; 128 var val =trim(idCard); 129 if(15==val.length) 130 { //15位身份证号码 131 birthdayValue = val.charAt(6)+val.charAt(7); 132 if(parseInt(birthdayValue)<10) 133 { 134 birthdayValue = '20'+birthdayValue; 135 } 136 else 137 { 138 birthdayValue = '19'+birthdayValue; 139 } 140 birthdayValue=birthdayValue+'-'+val.charAt(8)+val.charAt(9)+'-'+val.charAt(10)+val.charAt(11); 141 if(parseInt(val.charAt(14)/2)*2!=val.charAt(14)) 142 { 143 document.getElementById(sexId).value='男'; 144 } 145 else 146 { 147 document.getElementById(sexId).value='女'; 148 } 149 document.getElementById(birhId).value=birthdayValue; 150 } 151 if(18==val.length) 152 { //18位身份证号码 153 birthdayValue=val.charAt(6)+val.charAt(7)+val.charAt(8)+val.charAt(9)+'-'+val.charAt(10)+val.charAt(11) +'-'+val.charAt(12)+val.charAt(13); 154 if(parseInt(val.charAt(16)/2)*2!=val.charAt(16)) 155 { 156 document.getElementById(sexId).value='男'; 157 } 158 else 159 { 160 document.getElementById(sexId).value='女'; 161 } 162 document.getElementById(birhId).value=birthdayValue; 163 } 164 } 165 // 18位身份证号最后一位校验 166 function IDCard(Num) 167 { 168 if (Num.length!=18) 169 return false; 170 var x=0; 171 var y=''; 172 173 for(i=18;i>=2;i--) 174 x = x + (square(2,(i-1))%11)*parseInt(Num.charAt(19-i-1)); 175 x%=11; 176 y=12-x; 177 if (x==0) 178 y='1'; 179 if (x==1) 180 y='0'; 181 if (x==2) 182 y='X'; 183 return y; 184 } 185 186 // 求得x的y次方 187 function square(x,y) 188 { 189 var i=1; 190 for (j=1;j<=y;j++) 191 i*=x; 192 return i; 193 }
页面调用
1 <script type="text/javascript" src="/js/IDValidate.js"></script> 2 var card = document.getElementById("idcard").value; 3 if (IdCardValidate(card)) { 4 alert("ok") 5 } else { 6 alert("error"); 7 }