超精准的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 相关文章推荐
jquery中ajax学习笔记一
Oct 16 Javascript
javascript测试题练习代码
Oct 10 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
JQuery动画与特效实例分析
Feb 02 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
javascript倒计时效果实现
Nov 12 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
js插件Jcrop自定义截取图片功能
Oct 14 Javascript
Angular2入门教程之模块和组件详解
May 28 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
详解js删除数组中的指定元素
Oct 31 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 输出简单动态WAP页面
2009/06/09 PHP
用Zend Encode编写开发PHP程序
2010/02/21 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
javascript的内存管理详解
2013/08/07 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
JS中promise化微信小程序api
2018/04/12 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
python reduce 函数使用详解
2017/12/05 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
Python tkinter模版代码实例
2020/02/05 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python实现画图软件功能方法详解
2020/07/28 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
毕业证丢失证明
2014/01/15 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
党员一帮一活动总结
2014/07/08 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
交通事故案件代理词
2015/05/23 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS