超精准的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 相关文章推荐
IE bug table元素的innerHTML
Jan 11 Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
javascript检测对象中是否存在某个属性判断方法小结
May 19 Javascript
JS图像无缝滚动脚本非常好用
Feb 10 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
Mar 17 Javascript
JS实现向表格中动态添加行的方法
Mar 30 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
Aug 06 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
深入理解Vue 的条件渲染和列表渲染
Sep 01 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
关于Vue中$refs的探索浅析
Nov 05 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 远程关机操作的代码
2008/12/05 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
Python内置函数delattr的具体用法
2017/11/23 Python
python实现小球弹跳效果
2019/05/10 Python
使用python绘制温度变化雷达图
2019/10/18 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
销售总监工作职责
2013/11/21 职场文书
教师实习自我鉴定
2013/12/13 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
奠基仪式策划方案
2014/05/15 职场文书
介绍信范文
2015/01/31 职场文书
python 网络编程要点总结
2021/06/18 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL