js实现身份证验证功能

本文介绍了如何利用JavaScript在前端实现身份证号码的有效性验证,通过HTML代码展示验证过程。

 

html代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		身份证号:<input type="text">	
		<script src="../js/citys.js"></script>
		<script>
			var _input=document.querySelector("input");
			_input.onblur=function(){
				var num= this.value;
				var flag=checkId(num);
				if(!flag){
					alert("身份信息有误");
				}
			}
			/*
			 18位: 41072419980815451x
			 410724 1998 0815 451x
			 41:省编码前2位
			 4107:市编码前4位
			 410724:县编码
			 45:派出所编码
			 1:奇数为男,偶数为女
			 x:计算所得
			     1、将前面的身份证号码17位数分别乘以不同的系数。
			        从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;
			     2、将这17位数字和系数相乘的结果相加;
			     3、用加出来和除以11,看余数是多少;
			     4、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字,
				       其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。
			*/
		   //长度要合格
		   function checkId(ID){
			   if(ID.length>18){
				   return false;
			   }
		   
		   //先获取各省编码前两位
		   var shenCode=ID.substr(0,2);//从头开始截取,截取两位
		   //从函数中获取对应省的数组
		  var shens = citys.districts[0].districts;
		  console.log(shens);
		  //从获得的数组中找到对应省
		  var shen=shens.find(function(obj){
			  //找到数组中的省编码,并检查是否符合截取
			  return obj.adcode.startsWith(shenCode);
		  })
		  //省没有在编码中找到
		  if (shen == undefined) {
		  	return false;
		  }
		  //获取身份证前4位  市编码前两位
		  var cityCode = ID.substr(0, 4);
		  //获取市的数组
		  var cs = shen.districts;
		  console.log(cs);
		  //获取到的是对应的市
		  var city = cs.find(function(obj) {
		  	return obj.adcode.startsWith(cityCode);
		  })
		  if (city == undefined) {
		  	return false;
		  }
		  //获取身份证前6位  省编码前两位
		  var countyCode = ID.substr(0, 6);
		  //获取县的数组
		  var countys = city.districts;
		  //对应的县
		  var county = countys.find(function(obj) {
		  	return obj.adcode==countyCode;
		  })
		  if (county == undefined) {
		  	return false;
		  }
		  
		  //验证最后一位
		  // 1、将前面的身份证号码17位数分别乘以不同的系数。
		  //    从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;
		  var nums=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
				// 2、将这17位数字和系数相乘的结果相加;
				var res=nums.reduce(function(res,item,index){
					//ID的每一项(通过charAt下表找到对应字符串)分别*nums的每一项
					res+=ID.charAt(index)*item;
					return res;
				},0)
		  
		  
		  // 3、用加出来和除以11,看余数是多少;
			var mod=res%11;
		  
		  // 4、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字,
		  //       其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。
		  var endNums=[1,0,"x",9,8,7,6,5,4,3,2];
		  //substring截取17位以后的数字看是否符合数组endNums
		if(ID.substring(17)!=endNums[mod]){
			return false;
		}
		 return true;
		 }
		</script>
	</body>
</html>

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值