JavaScript实现身份证验证代码

 更新时间:2016年02月17日 11:04:18   投稿:hebedich  
本文给大家分享的是使用javascript实现身份验证的规则以及代码,非常的简单实用,有需要的小伙伴可以参考下。

18位身份证号码各位的含义

1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位男为单数,女为双数;
18位为校验码,0-9和X,由公式随机产生;

举例:

340523 1980 0101 0013这个身份证号的含义:
34为安徽省
05为马鞍山市
23为和县
19800101为出生日期(1980年1月1日)
001为顺序号(1为单数,代表为男性)
3为验证码

行政区划代码

最新县及县以上行政区划代码(截止2014年10月31日)

北京市 (110000 BJ)
天津市 (120000 TJ)
河北省 (130000 HE)
山西省 (140000 SX)
内蒙古自治区 (150000 NM)
辽宁省 (210000 LN)
吉林省 (220000 JL)
黑龙江省 (230000 HL)
上海市 (310000 SH)
江苏省 (320000 JS)
浙江省 (330000 ZJ)
安徽省 (340000 AH)
福建省 (350000 FJ)
江西省 (360000 JX)
山东省 (370000 SD)
河南省 (410000 HA)
湖北省 (420000 HB)
湖南省 (430000 HN)
广东省 (440000 GD)
广西壮族自治区 (450000 GX)
海南省 (460000 HI)
重庆市 (500000 CQ)
四川省 (510000 SC)
贵州省 (520000 GZ)
云南省 (530000 YN)
西藏自治区 (540000 XZ)
陕西省 (610000 SN)
甘肃省 (620000 GS)
青海省 (630000 QH)
宁夏回族自治区 (640000 NX)
新疆维吾尔自治区 (650000 XJ)
台湾省 (710000 Tw)
香港特别行政区 (810000 HK)
澳门特别行政区 (820000 Mo)

身份证第18位(校验码)的计算方法
将身份证号码前面的17位数分别乘以不同的系数;
从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
将这17位数字和系数相乘的结果相加;
用加出来和除以11,看余数是多少;
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;
其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
举例:
某男性的身份证号码是340523198001010013。我们要看看这个身份证是不是合法的身份证。

首先我们得出前17位的乘积和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185
然后再求余:
185 % 11 = 9
最后通过对应规则就可以知道余数9对应的数字是3。所以,可以判定这是一个合格的身份证号码。

JavaScript校验18位身份证

复制代码 代码如下:
var city = {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:"国外"};
var ID = '340523198001010013';

首先校验位数是否是18位:

if(!/^\d{17}(\d|x)$/i.test(ID)) return false;
// \d  匹配数字
// ^  匹配开始
// $  匹配结尾
// i  不区分大小写
// {17} 匹配17次
// \d|x 匹配数字或x

然后校验开头两位是否是合法的省(直辖市/自治区):

if(city[ID.substr(0,2)] === undefined) return "非法地区";

// stringObject.substr(start,length) 方法可在字符串中抽取从 start 下标开始的指定数目的字符
// 访问对象属性时除了可以用点(.)语法外,也可以用中括号([]),用中括号时更灵活

然后再校验出生日期是否合法:

var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
var d = new Date(birthday);
var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
var currentTime = new Date().getTime();
var time = d.getTime();
if(time >= currentTime || birthday !== newBirthday) return '非法生日';
// 获取身份证的年月日,然后再 new 一个 Date,再对比这两个日期是否一致
// 这里用Number()主要是因为身份证的日期是带0的,而new Date()出来的日期是不带0的,Number()之后就都不带0了

最后判断校验码是否正确:

var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
var sum = 0, i, residue;
for(i=0; i<17; i++) {
 sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) '非法证号';

如果以上校验都通过了,则是一个合法的身份证号;

完整代码

<script>
 function checkID(ID) {
  if(typeof ID !== 'string') return '非法字符串';
  var city = {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:"国外"};
  var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
  var d = new Date(birthday);
  var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
  var currentTime = new Date().getTime();
  var time = d.getTime();
  var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  var sum = 0, i, residue;
 
  if(!/^\d{17}(\d|x)$/i.test(ID)) return '非法身份证';
  if(city[ID.substr(0,2)] === undefined) return "非法地区";
  if(time >= currentTime || birthday !== newBirthday) return '非法生日';
  for(i=0; i<17; i++) {
   sum += ID.substr(i, 1) * arrInt[i];
  }
  residue = arrCh[sum % 11];
  if (residue !== ID.substr(17, 1)) return '非法身份证哦';
 
  return city[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?" 男":"女")
 }
</script>

相关文章

  • js 二进制流转图片的操作方法

    js 二进制流转图片的操作方法

    这篇文章主要介绍了js 二进制流转图片的操作方法,接收数据大家需要注意,如果后端的接口是get方法,可以直接使用img标签,本文通过示例代码讲解的非常详细,需要的朋友参考下吧
    2023-12-12
  • javascript学习网址备忘

    javascript学习网址备忘

    javascript学习网址备忘...
    2007-05-05
  • Ajax基础知识详解

    Ajax基础知识详解

    本文主要介绍了Ajax基础知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JavaScript函数重载操作实例浅析

    JavaScript函数重载操作实例浅析

    这篇文章主要介绍了JavaScript函数重载操作,结合一次面试经历分析了JavaScript函数重载相关原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • JavaScript实现系统防挂机(无操作弹窗)的示例详解

    JavaScript实现系统防挂机(无操作弹窗)的示例详解

    在一些学习系统,或者考试系统中。一旦出现长时间未操作,就会判定这个人不在场。所以就会进行退出系统,处于对安全和系统负担还有业务的需求。本文就来用JavaScript做一个系统防挂机功能,需要的可以参考一下
    2023-01-01
  • js重写方法的简单实现

    js重写方法的简单实现

    下面小编就为大家带来一篇js重写方法的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • javascript 获取模态窗口的滚动位置代码

    javascript 获取模态窗口的滚动位置代码

    模态窗口的滚动位置获取办法还有不知道的吗?下面的方法或许对大家有所帮助,感兴趣的朋友可以了解下,希望对大家有所帮助
    2013-08-08
  • 详解JavaScript对数组操作(添加/删除/截取/排序/倒序)

    详解JavaScript对数组操作(添加/删除/截取/排序/倒序)

    这篇文章主要介绍了JavaScript对数组操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 如何使用js获取扩展名详解

    如何使用js获取扩展名详解

    给你一个文件名,你能获得它的扩展名吗?这篇文章主要给大家介绍了关于如何使用js获取扩展名的相关资料,文中介绍了几种实现的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下
    2016-04-04

最新评论