js实现身份证号码验证的简单实例


Posted in Javascript onFebruary 19, 2014

以下是根据身份证号码编码规则,使用JS对其进行有效性验证代码

IdCard-Validate.js代码如下:

/**
 * 身份证15位编码规则:dddddd yymmdd xx p 
 * dddddd:地区码 
 * yymmdd: 出生年月日 
 * xx: 顺序类编码,无法确定 
 * p: 性别,奇数为男,偶数为女
 * <p />
 * 身份证18位编码规则:dddddd yyyymmdd xxx y 
 * dddddd:地区码 
 * yyyymmdd: 出生年月日 
 * xxx:顺序类编码,无法确定,奇数为男,偶数为女 
 * y: 校验码,该位数值可通过前17位计算获得
 * <p />
 * 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);
 } else if (idCard.length == 18) {
  var a_idCard = idCard.split("");// 得到身份证数组
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){
   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;
 }
}
/**
 * 通过身份证判断是男是女
 * @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;
 }
// 可对传入字符直接当作数组来处理
// if(idCard.length==15){
// alert(idCard[13]);
// if(idCard[13]%2==0){
// return 'female';
// }else{
// return 'male';
// }
// }else if(idCard.length==18){
// alert(idCard[16]);
// if(idCard[16]%2==0){
// return 'female';
// }else{
// return 'male';
// }
// }else{
// return null;
// }
}
 /**
  * 验证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, "");
}

对于上述代码中,关于性别的判断在实际使用中,可加入首先判断身份证是否有效。在本代码示例中并未进行该种判断,有点鸡肋的感觉,可在实际使用中根据情况进行丰满。
Javascript 相关文章推荐
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
实现div内部滚动条滚动到底部和顶部的代码
Nov 15 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
Sep 29 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
微信小程序用户拒绝授权的处理方法详解
Sep 20 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
Nov 11 Javascript
js实现表格字段排序
Feb 19 #Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 #Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 #Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 #Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 #Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 #Javascript
JS执行删除前的判断代码
Feb 18 #Javascript
You might like
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
JS冒泡事件的快速解决方法
2013/12/16 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
在Python中处理XML的教程
2015/04/29 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
考试违纪检讨书
2014/02/02 职场文书
安全生产大检查方案
2014/05/07 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python