e8sp
  1 //这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。 
  2 
  3 (function($){
  4 
  5      $.fn.isIdCard= function(options) {
  6          
  7         var opts = $.extend({},$.fn.isIdCard.deflunt,options);
  8         var BindBirthDay=opts.BindBirthDay;
  9         var BirthDayID=opts.BirthDayID;
 10   
 11 
 12         $(this).blur(function(){
 13  
 14                                        
 15             var CardValue =$(this).val().toUpperCase();  
 16             
 17             //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。   
 18     
 19               if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(CardValue)))
 20               {             
 21                 //ErrorMsginnerHTML=\'输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数
 22                 //var ErrorMsginnerHTML="你这个身份证号码是那个公安局颁发的啊!仔细看看再说 位数不对吧"; 
 23                 
 24                 ErrMsgType(opts,opts.onIDCardError);
 25                 return false
 26     
 27               }
 28               else
 29               {
 30                   $(this).isIdCards(opts); // 主要验证出 地区是否正确 和生年月日 
 31               }
 32     
 33             
 34             
 35             //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
 36             
 37             //下面分别分析出生日期和校验
 38             
 39             var CardLen, strReg; 
 40             
 41             CardLen = CardValue.length; 
 42         
 43     
 44             if (CardLen == 15) 
 45         
 46             { 
 47         
 48                     strReg = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); 
 49                     
 50                     var arrSplit = CardLen.match(strReg); 
 51                     
 52                     //检查生日日期是否正确 
 53                     
 54                     var dtmBirth = new Date(\'19\' + arrSplit[2] + \'-\' + arrSplit[3] + \'-\' + arrSplit[4]); 
 55         
 56                     var Y=(dtmBirth.getYear() == Number(arrSplit[2])) ;
 57                     var M=((dtmBirth.getMonth() + 1) == Number(arrSplit[3]));
 58                     var D=(dtmBirth.getDate() == Number(arrSplit[4]));
 59                     
 60                     var bGoodDay = Y && M && D;
 61                     
 62                     if (!bGoodDay) 
 63                     
 64                     { 
 65                         //alert(\'输入的身份证号里出生日期不对!\');  return false;  
 66              
 67                         //ErrorMsginnerHTML=\'输入的身份证号里出生日期不对!\';
 68                         ErrMsgType(opts,opts.onBsdayErrorMsg);
 69                         return false
 70         
 71                     } 
 72                     
 73                     else 
 74                     
 75                     { 
 76                     
 77                         //将15位身份证转成18位     
 78                         //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
 79         
 80                        var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
 81         
 82                        var arrCh = new Array(\'1\', \'0\', \'X\', \'9\', \'8\', \'7\', \'6\', \'5\', \'4\', \'3\', \'2\'); 
 83         
 84                        var nTemp = 0, i;   
 85         
 86                        CardValue = CardValue.substr(0, 6) + \'19\' + CardValue.substr(6, CardValue.length - 6); 
 87         
 88                        for(i = 0; i < 17; i ++) 
 89         
 90                        { nTemp += CardValue.substr(i, 1) * arrInt[i]; } 
 91         
 92                        CardValue += arrCh[nTemp % 11];   
 93         
 94                        return CardValue;   
 95                     
 96                     }   
 97         
 98             } 
 99         
100         
101             
102                 if (CardLen == 18) 
103             
104                 { 
105             
106                     strReg = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); 
107             
108                     var arrSplit = CardValue.match(strReg); 
109             
110             
111                     //检查生日日期是否正确
112             
113                     var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); 
114                     var NowBirth= new Date();
115             
116                     var Y=(NowBirth.getFullYear() >= Number(arrSplit[2]));
117                     var M=((dtmBirth.getMonth() + 1) == Number(arrSplit[3]));
118                     var D=(dtmBirth.getDate() == Number(arrSplit[4]));
119             
120                     var bGoodDay = Y && M && D;
121             
122                     if (!bGoodDay) 
123             
124                     { 
125                            // ErrorMsginnerHTML=\'输入的身份证号里出生日期不对!\';
126                            ErrMsgType(opts,opts.onDateFmtErrorMsg);
127             
128                             //return false; 
129                     } 
130             
131                     else 
132                     // 选择 出生年月 与 身份证编码部分也不能通
133                     { 
134             
135                       if(BindBirthDay){
136                           
137                              birth=$(BirthDayID).val().split("-");
138                              var MyBirth = new Date(birth[0] + "/" + birth[1] + "/" + birth[2]); 
139              
140                            
141                              var Y=(MyBirth.getFullYear() == Number(arrSplit[2]));
142                              var M=((MyBirth.getMonth() + 1) == Number(arrSplit[3]));
143                              var D=(MyBirth.getDate() == Number(arrSplit[4]));
144              
145                              var MyGoodDay = Y && M && D;
146             
147             
148             
149                              if (!MyGoodDay)
150                          
151                              {
152                                     //ErrorMsginnerHTML=\'输入的身份证号和出生日期不不符合啊!\'; 
153                                     // 即使找到规律 选择 出生年月 与 身份证编码部分也不能通过
154                                     ErrMsgType(opts,opts.onDateFmtErrorMsg);
155                          
156                                     //return false; 
157                              }
158                              
159                           } //else{}
160                          
161                             //检验18位身份证的校验码是否正确。 
162                             
163                             //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字1
164             
165                             var valnum; 
166             
167                             var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
168             
169                             var arrCh = new Array(\'1\', \'0\', \'X\', \'9\', \'8\', \'7\', \'6\', \'5\', \'4\', \'3\', \'2\'); 
170             
171                             var nTemp = 0, i; 
172             
173                             for(i = 0; i < 17; i ++) 
174             
175                             { 
176             
177                                 nTemp += CardValue.substr(i, 1) * arrInt[i]; 
178             
179                             } 
180             
181                             valnum = arrCh[nTemp % 11]; 
182             
183                             if (valnum != CardValue.substr(17, 1)) 
184             
185                             { 
186             
187                                 Sex=(valnum/2)!=0?"男":"女"
188                                 //身份证的校验码不正确啊!  + valnum
189                                 ErrorMsginnerHTML=\'又错了!你男的还女的啊!公安局的说你这个号码的主人应该是:\'+ Sex +"的哦!身份证最后一位是"+ valnum ; 
190                                 
191                                 opts.onCkCodeErrorMsg=opts.onCkCodeErrorMsg.length>0?opts.onCkCodeErrorMsg:ErrorMsginnerHTML;
192                                 
193                                 ErrMsgType(opts,opts.onCkCodeErrorMsg);
194             
195                                 return false
196             
197                             }else{
198                                 
199                                 RigthMsgType(opts);
200                                 
201                             }
202             
203                     }
204             
205                     return CardValue; 
206             
207                     
208                     
209             }
210  
211         
212         }) 
213 
214     };
215  
216 
217 
218 
219 $.fn.isIdCards=function(opts)
220 {
221  
222     var MyIDCardValue=$(opts.MyCardID).val();
223     
224     var idcard =MyIDCardValue;
225     
226     var Errors=new Array( 
227         "身份证号码位数不对吧!仔细看看再说", 
228         "你那年出生的啊?出生年月日都不知道了 想想再来填吧", 
229         "身份证号码校验错误! 你男的还女的啊!", //奇数是男性,偶数是女性.
230         "晕死~~~ 你来自火星的吧!地球人没有这个身份证编码的哦!" //身份证为空或地区非法!
231         ); 
232         
233     var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
234     33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
235     51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}  
236     
237     var Y,JYM; 
238     var S,M; 
239     var idcard_array = new Array(); 
240     idcard_array = idcard.split(""); 
241     //地区检验
242     if(area[parseInt(idcard.substr(0,2))]==null)
243     {
244         ErrMsgType(opts,opts.onNOthisIDCard);
245         //ErrMsgType(Errors[3]);
246         return false;
247     }else{
248         
249          var content=area[parseInt(idcard.substr(0,2))]+"省公安局的说:";
250          //alert(content);
251          $(opts.RightMsgID).html(content);
252         
253         }
254     //身份号码位数及格式检验 
255     switch(idcard.length){ 
256         case 15: 
257             if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){ 
258                 ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; 
259             } 
260             else { 
261                 ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;
262             } 
263             if(ereg.test(idcard)){
264                 return true;
265             }
266             else{
267 
268                  //ErrMsgType(Errors[1]);
269                 ErrMsgType(opts,opts.onDateFmtErrorMsg);
270                 return false;
271             } 
272             return false
273         case 18: 
274             if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){ 
275                 ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/; 
276             } 
277             else { 
278                 ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; 
279             } 
280             if(ereg.test(idcard)){ 
281                 S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 
282                 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 
283                 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 
284                 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 
285                 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 
286                 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 
287                 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 
288                 + parseInt(idcard_array[7]) * 1  
289                 + parseInt(idcard_array[8]) * 6 
290                 + parseInt(idcard_array[9]) * 3 ; 
291                 Y = S % 11; 
292                 M = "F"; 
293                 JYM = "10X98765432"; 
294                 M = JYM.substr(Y,1);//判断校验位 
295                 if(M != idcard_array[17]){
296                     
297                     //ErrMsgType(Errors[2]);
298                     ErrMsgType(opts,opts.onCkCodeErrorMsg);
299                     return false;
300                 } 
301                 return true;
302             } 
303             else {
304 
305                 //ErrMsgType(Errors[1]);
306                 ErrMsgType(opts,opts.onDateFmtErrorMsg);
307                 return false;
308             }
309             default
310                 //ErrMsgType(Errors[0]);
311                 ErrMsgType(opts,opts.onIDCardError);
312                 return false
313     } 
314 };
315 
316 
317 
318        RigthMsgType=function (opts){
319            
320         //var opts=$.fn.isIdCard.deflunt;
321 
322         var ErrMsgType=opts.ErrMsgType;
323         var RightMsgID=opts.RightMsgID;
324         var RightMsgVal=opts.RightMsgVal;
325  
326  
327         if(ErrMsgType)
328         {  
329             $(RightMsgID).addClass(opts.RightClass);
330             $(RightMsgID).append(RightMsgVal);
331         }
332         else{ alert(MsgTxt); }
333         
334         ChangeStyle(opts);
335           
336     };
337 
338 
339     ChangeStyle=function (opts){
340            
341             var genNoteFlag = 0;
342         
343             var genNoteFlag=parseInt(Math.random()*15);
344             var Rstyle="style"+genNoteFlag;
345             var divs="div"+parseInt(Math.random()*21);
346             
347             if(opts.AutoChangeStyle){
348                 $(opts.ErrorMsgID).removeAttr("Class").addClass(Rstyle);
349                 $(opts.RightMsgID).removeAttr("Class").addClass(divs);
350                 $(opts.MyCardID).removeAttr("Class").addClass(Rstyle);
353             }
354             
355             
362         };
363 
364 
365       // 错误提示类型 
366       ErrMsgType=function (opts,ErrorMsgTxt)
367       {
368         // var opts=$.fn.isIdCard.deflunt;
369         var ErrMsgType=opts.ErrMsgType;
370         var ErrorMsgID=opts.ErrorMsgID;
371         var MyCardID=opts.MyCardID;
372 
373 
374 
375         ErrorMsginnerHTML=\'你这个身份证号码是那个公安局颁发的啊!仔细看看再说\';  
376         ErrorMsgTxt=(ErrorMsgTxt.length<=0)?ErrorMsginnerHTML:ErrorMsgTxt;
377         
378         
379         
380         if(ErrMsgType)
381         {  
382             $(ErrorMsgID).addClass(opts.errorClass);
383             $(ErrorMsgID).html(ErrorMsgTxt);
384         }
385         else{ alert(ErrorMsgTxt); }
386         
387           $(MyCardID).focus();
388 
389           $(MyCardID).css("borderColor","#CCC");
390           
391           //alert(opts.errorClass+ErrorMsgTxt+ErrMsgType+ErrorMsgID);
392           
393           ChangeStyle(opts);
394      };
395      
396 
397  /**
398  
399  
400  */
401 
402     $.fn.isIdCard.deflunt={
403         MyCardID:"#MyCardID",
404         BindBirthDay:true,
405         BirthDayID : ".BirthDayID", // 出生日期格式为 1981-11-10(必须)
406         ErrorMsgID:"#ErrorMsgID",
407         onIDCardError:"你这个身份证号码是那个公安局颁发的啊!仔细看看再说 位数不对吧",
408         onBsdayErrorMsg :"你的身份证号码和出生年月日不匹配",
409         onDateFmtErrorMsg :"你那年出生的啊?出生年月日都不知道了 想想再来填吧",
410         onCkCodeErrorMsg :"", //身份证号码校验错误! 你男的还女的啊!//身份证的校验码不正确啊!奇数是男性,偶数是女性
411         onNOthisIDCard:"晕死~~~ 你来自火星的吧!地球人没有这个身份证编码的哦!", //身份证为空或地区非法!
412         ErrMsgType:true,
413         errorClass:"errorClass",
414         
415         RightMsgID:"#RightMsgID",
416         RightMsgVal :"你的身份证号码验证通过",
417         RightClass:"RightClass",
418         AutoChangeStyle:true
419 
420     };
421 
422 
423 })(jQuery); 

 

 

原本是一个Js文件为了方便 现封装为JQuery 插件掉如下

 

$(function(){
    $(".CardID").isIdCard({
        MyCardID:"#CardID", //控件ID
        BindBirthDay:true,//是否绑定出生年月日
        BirthDayID : ".BirthDayID",// 出生日期ID (格式为 1981-11-10 必须)
        ErrorMsgID:"#ErrorMsgID",//错误提示信息ID
        ErrMsgType:true,//错误提示方式 (false 为alert提示 同时可以忽略上边一条)
        errorClass:"ErrorMsg",//错误提示信息行样式(false 为alert提示 同时可以忽略上边两条)

        onIDCardError:"你这个身份证号码是那个公安局颁发的啊!仔细看看再说 位数不对吧",
        onBsdayErrorMsg :"你的身份证号码和出生年月日不匹配",
        onDateFmtErrorMsg :"你那年出生的啊?出生年月日都不知道了 想想再来填吧",
        //onCkCodeErrorMsg :"身份证号码校验错误! 你男的还女的啊!", //身份证号码校验错误! 你男的还女的啊!//身份证的校验码不正确啊!奇数是男性,偶数是女性
        onNOthisIDCard:"晕死~~~ 你来自火星的吧!地球人没有这个身份证编码的哦!", //身份证为空或地区非法!
 
        
        RightMsgID:"#RightMsgID",
        RightMsgVal :"你的身份证号码验证通过了 嘿嘿",
        RightClass:"RightClass",
        AutoChangeStyle:true //是否自动变换颜色提示错误(须Css支持 请从339行看起)

    });
    
})

 

演示地址:http://www.e8sp.com/IDCard/IDCards.html 

 

 

分类:

技术点:

相关文章:

  • 2021-12-25
  • 2021-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-12
  • 2022-12-23
  • 2021-12-23
  • 2021-04-27
相关资源
相似解决方案