超精准的javascript验证身份证号的具体实现方法


Posted in Javascript onNovember 18, 2015

编写程序前先来了解下身份证号的构成:

身份证号分为两种,旧的为15位,新的为18位。

身份证15位编码规则:dddddd yymmdd xx p   

其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女;

身份证18位编码规则:dddddd yyyymmdd xxx y   

其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数

18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]    验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]    校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )    

i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置。

var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];   // 身份证验证位值.10代表X 
function IdCardValidate(idCard) { 
 idCard = trim(idCard.replace(/ /g, ""));    //去掉字符串头尾空格      
 if (idCard.length == 15) { 
  return isValidityBrithBy15IdCard(idCard);  //进行15位身份证的验证 
 } else if (idCard.length == 18) { 
  var a_idCard = idCard.split("");    // 得到身份证数组 
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ //进行18位身份证的基本验证和第18位的验证
   return true; 
  }else { 
   return false; 
  } 
 } else { 
  return false; 
 } 
} 
/** 
 * 判断身份证号码为18位时最后的验证位是否正确 
 * @param a_idCard 身份证号码数组 
 * @return 
 */ 
function isTrueValidateCodeBy18IdCard(a_idCard) { 
 var sum = 0;        // 声明加权求和变量 
 if (a_idCard[17].toLowerCase() == 'x') { 
  a_idCard[17] = 10;     // 将最后位为x的验证码替换为10方便后续操作 
 } 
 for ( var i = 0; i < 17; i++) { 
  sum += Wi[i] * a_idCard[i];   // 加权求和 
 } 
 valCodePosition = sum % 11;    // 得到验证码所位置 
 if (a_idCard[17] == ValideCode[valCodePosition]) { 
  return true; 
 } else { 
  return false; 
 } 
} 
/** 
 * 验证18位数身份证号码中的生日是否是有效生日 
 * @param idCard 18位书身份证字符串 
 * @return 
 */ 
function isValidityBrithBy18IdCard(idCard18){ 
 var year = idCard18.substring(6,10); 
 var month = idCard18.substring(10,12); 
 var day = idCard18.substring(12,14); 
 var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
 // 这里用getFullYear()获取年份,避免千年虫问题 
 if(temp_date.getFullYear()!=parseFloat(year) 
   ||temp_date.getMonth()!=parseFloat(month)-1 
   ||temp_date.getDate()!=parseFloat(day)){ 
   return false; 
 }else{ 
  return true; 
 } 
} 
 /** 
 * 验证15位数身份证号码中的生日是否是有效生日 
 * @param idCard15 15位书身份证字符串 
 * @return 
 */ 
 function isValidityBrithBy15IdCard(idCard15){ 
  var year = idCard15.substring(6,8); 
  var month = idCard15.substring(8,10); 
  var day = idCard15.substring(10,12); 
  var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
  // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
  if(temp_date.getYear()!=parseFloat(year) 
    ||temp_date.getMonth()!=parseFloat(month)-1 
    ||temp_date.getDate()!=parseFloat(day)){ 
    return false; 
  }else{ 
   return true; 
  } 
 } 
//去掉字符串头尾空格 
function trim(str) { 
 return str.replace(/(^\s*)|(\s*$)/g, ""); 
}

 根据身份证号对其进行性别的判定

/** 
 * 通过身份证判断是男是女 
 * @param idCard 15/18位身份证号码 
 * @return 'female'-女、'male'-男 
 */ 
function maleOrFemalByIdCard(idCard){ 
 idCard = trim(idCard.replace(/ /g, ""));  // 对身份证号码做处理。包括字符间有空格。 
 if(idCard.length==15){ 
  if(idCard.substring(14,15)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else if(idCard.length ==18){ 
  if(idCard.substring(14,17)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else{ 
  return null; 
 } 
}

以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别,是不是很神奇,欢迎大家学习借鉴。

Javascript 相关文章推荐
javascript实现的鼠标链接提示效果生成器代码
Jun 28 Javascript
JavaScript 创建对象
Jul 17 Javascript
JSQL  一个 web DB 的封装
May 05 Javascript
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
Dec 16 Javascript
JavaScript数组迭代器实例分析
Jun 09 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
Vue 组件注册实例详解
Feb 23 Javascript
Vue父组件如何获取子组件中的变量
Jul 24 Javascript
如何基于JS截获动态代码
Dec 25 Javascript
javascript的var与let,const之间的区别详解
Feb 18 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 #Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 #Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 #Javascript
jquery可定制的在线UEditor编辑器
Nov 17 #Javascript
JS实现选项卡实例详解
Nov 17 #Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 #Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 #Javascript
You might like
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php简单图像创建入门实例
2015/06/10 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
关于js类的定义
2011/06/28 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
详解python的数字类型变量与其方法
2016/11/20 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
优秀毕业生求职信范文
2014/01/02 职场文书
单位提档介绍信
2015/10/22 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
Vue2.0搭建脚手架
2022/03/13 Vue.js
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫