超精准的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 相关文章推荐
使用户点击后退按钮使效三行代码
Jul 07 Javascript
JQuery 实现的页面滚动时浮动窗口控件
Jul 10 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
Jan 08 Javascript
jquery获取元素值的方法(常见的表单元素)
Nov 15 Javascript
Javascript基础教程之if条件语句
Jan 18 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
jquery简单实现幻灯片的方法
Aug 03 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
Angular.js中数组操作的方法教程
Jul 31 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
vue中过滤器filter的讲解
Jan 21 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中time(),date(),mktime()区别介绍
2013/09/28 PHP
dedecms中使用php语句指南
2014/11/13 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
php实现登陆模块功能示例
2016/10/20 PHP
php-app开发接口加密详解
2018/04/18 PHP
五段实用的js高级技巧
2011/12/20 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
javascript实现简易计算器
2017/02/01 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
Python 比较两个数组的元素的异同方法
2017/08/17 Python
python中列表和元组的区别
2017/12/18 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
银行员工职业规划范文
2014/01/21 职场文书
学生鉴定评语大全
2014/05/05 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
房屋出租委托书格式
2014/09/23 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
春节晚会开场白
2015/05/29 职场文书
婚庆司仪开场白
2015/05/29 职场文书
2016党员入党决心书
2015/09/22 职场文书