超精准的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 陷阱 window全局对象
Nov 26 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
JS动态添加iframe的代码
Sep 14 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
javaScript数组迭代方法详解
Apr 14 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
vue中 this.$set的用法详解
Sep 06 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
长波有什么东西
2021/03/01 无线电
php中看实例学正则表达式
2006/12/25 PHP
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
PHP数据类型的总结分析
2013/06/13 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP多态代码实例
2015/06/26 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
js加解密 脚本解密
2008/02/22 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Mac 上切换Python多版本
2017/06/17 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python3多线程基础知识点
2019/02/19 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
python如何写出表白程序
2020/06/01 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
争论的故事教学反思
2014/02/06 职场文书
党员干部承诺书
2014/03/25 职场文书
交通事故协议书
2014/04/15 职场文书
2015年元旦活动总结
2014/05/09 职场文书
环保项目建议书
2014/08/26 职场文书
高校教师个人总结
2015/02/10 职场文书
教师个人年终总结
2015/02/11 职场文书