一个完整的 JS 身份证校验代码

身份证号码是由 18 位数字组成的,它们分别表示:
(1) 前 1、2 位数字表示: 所在省份的代码;
(2) 第 3、4 位数字表示: 所在城市的代码;
(3) 第 5、6 位数字表示: 所在区县的代码;
(4) 第 7~14 位数字表示: 出生年、月、日 (7、8、9、10 位是年,11、12 位是月,13、14 位是日);
(5) 第 15、16 位数字表示: 所在地的派出所的代码;
(6) 第 17 位数字表示性别: 奇数表示男性,偶数表示女性;
(7) 第 18 位数字是校检码: 校检码可以是 0~9 的数字,有时也用 x 表示。

/**
* 校验身份证号合法性
*/
function checkIdNumberValid(tex){
var tip = '输入的身份证号有误,请检查后重新输入!';
var num = tex.value;
num = num.toUpperCase(); var len, re;
len = num.length;
if(len == 0) return true; //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))){
alert(tip);
tex.focus();
return false;
} //验证前两位地区是否有效
var aCity= {11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",
32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",
44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",
62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} if(aCity[parseInt(num.substr(0,2))] == null){
alert(tip);
tex.focus();
return false;
} //当身份证为15位时的验证出生日期。
if (len == 15){
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
var arrSplit = num.match(re); //检查生日日期是否正确
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay){
alert(tip);
tex.focus();
return false;
}
} //当身份证号为18位时,校验出生日期和校验位。
if (len == 18){
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
var arrSplit = num.match(re);
//检查生日日期是否正确
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay){
alert(tip);
tex.focus();
return false;
}
else{
//检验18位身份证的校验码是否正确。
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
for(i = 0; i < 17; i ++){
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)){
alert(tip);
tex.focus();
return false;
}
}
}
return true;
}

最新文章

  1. ios - block循环引用Demo示例
  2. jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等
  3. WordPress网站搭建
  4. WCF初探-2:手动实现WCF程序
  5. BZOJ 1192: [HNOI2006]鬼谷子的钱袋 数学结论
  6. sql 通过游标 拆分xml结构
  7. Centos 6.5LAMP服务器(Apache+PHP+MySQL)的搭建
  8. COCOS2D-X学习笔记(一)-----Node类的学习
  9. 几种常见的FTP软件的二进制设置说明
  10. 图片异步加载 ,KVO
  11. 服务列表 - Sina App Engine
  12. ASP.NET——验证码的制作
  13. (转)解决jdk1.8中发送邮件失败(handshake_failure)问题
  14. Breathe me
  15. 安全之路 —— 使用Windows全局钩子打造键盘记录器
  16. java获取年份的第一天和最后一天
  17. CentOS 系统状况查看
  18. Pipeline组Alpha版本发布说明
  19. vue v-for(数组遍历)
  20. python中常见的日期换算

热门文章

  1. iOS APNs实战分享
  2. kendalltau肯德尔和谐系数
  3. K8S dashboard 创建只读账户
  4. Codeforces 148 D Bag of mice
  5. Codeforces 797 F Mice and Holes
  6. CF835 D DP
  7. .net core 中 identity server 4 之Server简单示例
  8. [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails
  9. XML & JSON---iOS-Apple苹果官方文档翻译
  10. HMM的概述(五个基本元素、两个假设、三个解决的问题)