超精准的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 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
js类型检查实现代码
Oct 29 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
Mar 18 Javascript
js动态修改input输入框的type属性(实现方法解析)
Nov 13 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
Aug 04 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
React-router 4 按需加载的实现方式及原理详解
May 25 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
移动端效果之Swiper详解
Oct 09 Javascript
详解JavaScript的变量
Apr 04 Javascript
jquery实现的分页显示功能示例
Aug 23 jQuery
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
Session的工作方式
2006/10/09 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
深入解析php中的foreach函数
2013/08/31 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP安全上传图片的方法
2015/03/21 PHP
javascript prototype 原型链
2009/03/12 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
js分页代码分享
2014/04/28 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
Python获取脚本所在目录的正确方法
2014/04/15 Python
python中将字典转换成其json字符串
2014/07/16 Python
基于python log取对数详解
2018/06/08 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
python能开发游戏吗
2020/06/11 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
性能测试工程师的面试题
2015/02/20 面试题
扩大国家免疫规划实施方案
2014/03/21 职场文书
家长会主持词
2014/03/26 职场文书
怎样写离婚协议书
2015/01/26 职场文书