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
4 function idCardInValid(idCard) {
5 idCard = trim(idCard.replace(/ /g, "")); // 去掉字符串头尾空格
6 if (idCard.length == 15) {
7 return isValidityBrithBy15IdCard(idCard); // 进行15位身份证的验证
8 } else if (idCard.length == 18) {
9 var a_idCard = idCard.split(""); // 得到身份证数组
10 if (isValidityBrithBy18IdCard(idCard)
11 && isTrueValidateCodeBy18IdCard(a_idCard)) { // 进行18位身份证的基本验证和第18位的验证
12 return true;
13 } else {
14 return false;
15 }
16 } else {
17 return false;
18 }
19 }
20 /**
21 * 判断身份证号码为18位时最后的验证位是否正确
22 *
23 * @param a_idCard
24 * 身份证号码数组
25 * @return
26 */
27 function isTrueValidateCodeBy18IdCard(a_idCard) {
28 var sum = 0; // 声明加权求和变量
29 if (a_idCard[17].toLowerCase() == 'x') {
30 a_idCard[17] = 10; // 将最后位为x的验证码替换为10方便后续操作
31 }
32 for (var i = 0; i < 17; i++) {
33 sum += Wi[i] * a_idCard[i]; // 加权求和
34 }
35 valCodePosition = sum % 11; // 得到验证码所位置
36 if (a_idCard[17] == ValideCode[valCodePosition]) {
37 return true;
38 } else {
39 return false;
40 }
41 }
42 /**
43 * 验证18位数身份证号码中的生日是否是有效生日
44 *
45 * @param idCard
46 * 18位书身份证字符串
47 * @return
48 */
49 function isValidityBrithBy18IdCard(idCard18) {
50 var year = idCard18.substring(6, 10);
51 var month = idCard18.substring(10, 12);
52 var day = idCard18.substring(12, 14);
53 var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
54 // 这里用getFullYear()获取年份,避免千年虫问题
55 if (temp_date.getFullYear() != parseFloat(year)
56 || temp_date.getMonth() != parseFloat(month) - 1
57 || temp_date.getDate() != parseFloat(day)) {
58 return false;
59 } else {
60 return true;
61 }
62 }
63 /**
64 * 验证15位数身份证号码中的生日是否是有效生日
65 *
66 * @param idCard15
67 * 15位书身份证字符串
68 * @return
69 */
70 function isValidityBrithBy15IdCard(idCard15) {
71 var year = idCard15.substring(6, 8);
72 var month = idCard15.substring(8, 10);
73 var day = idCard15.substring(10, 12);
74 var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
75 // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
76 if (temp_date.getYear() != parseFloat(year)
77 || temp_date.getMonth() != parseFloat(month) - 1
78 || temp_date.getDate() != parseFloat(day)) {
79 return false;
80 } else {
81 return true;
82 }
83 }
84 // 去掉字符串头尾空格
85 function trim(str) {
86 return str.replace(/(^\s*)|(\s*$)/g, "");
87 }