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);
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行看起)
});
})
$(".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