js验证身份证格式

(function(){
    
    Validate={
            data:{
                    // 加权因子  
                    Wi : [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ],
                    
                    // 身份证验证位值.10代表X  
                    ValideCode : [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
                 },
            /** 
             * 身份证15位编码规则:dddddd yymmdd xx p  
             * dddddd:地区码  
             * yymmdd: 出生年月日  
             * xx: 顺序类编码,无法确定  
             * p: 性别,奇数为男,偶数为女 
             * <p /> 
             * 身份证18位编码规则:dddddd yyyymmdd xxx y  
             * dddddd:地区码  
             * yyyymmdd: 出生年月日  
             * xxx:顺序类编码,无法确定,奇数为男,偶数为女  
             * y: 校验码,该位数值可通过前17位计算获得 
             * <p /> 
             * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] 
             * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]  
             * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )  
             * i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置 
             *  
             */ 
            idCardValidate : function (idCard) {  
                if (idCard.length == 15) {  
                    return Validate.isValidityBrithBy15IdCard(idCard);  
                } else if (idCard.length == 18) {  
                    var a_idCard = idCard.split("");// 得到身份证数组  
                    if(Validate.isValidityBrithBy18IdCard(idCard)
                            &&Validate.isTrueValidateCodeBy18IdCard(a_idCard)){  
                        return true;  
                    }else {  
                        return false;  
                    }  
                } else {  
                    return false;  
                }  
            },

            /** 
             * 判断身份证号码为18位时最后的验证位是否正确 
             * @param a_idCard 身份证号码数组 
             * @return 
             */ 
            isTrueValidateCodeBy18IdCard : function (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 += Validate.data.Wi[i] * a_idCard[i];// 加权求和  
                }  
                valCodePosition = sum % 11;// 得到验证码所位置  
                if (a_idCard[17] == Validate.data.ValideCode[valCodePosition]) {  
                    return true;  
                } else {  
                    return false;  
                }  
            },
            
            /** 
             * 通过身份证判断是男是女 
             * @param idCard 15/18位身份证号码  
             * @return 'female'-女、'male'-男 
             */ 
            maleOrFemalByIdCard : function (idCard){  
                if(idCard.length==15){  
                    if(idCard.substring(14,15)%2==0){  
                        return 'female';  
                    }else{  
                        return 'male';  
                    }  
                }else if(idCard.length ==18){  
                    if(idCard.substring(14,17)%2==0){  
                        return 'female';  
                    }else{  
                        return 'male';  
                    }  
                }else{  
                    return null;  
                }
            },
            
            /** 
              * 验证18位数身份证号码中的生日是否是有效生日 
              * @param idCard 18位书身份证字符串 
              * @return 
              */ 
            isValidityBrithBy18IdCard : function (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 
               */ 
            isValidityBrithBy15IdCard : function (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;  
                    }  
              }
                         
    }
    
})()
原文地址:https://www.cnblogs.com/zoulei/p/3730035.html