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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
增强的 JavaScript 的 trim 函数的代码
Aug 13 Javascript
Mootools 1.2教程 输入过滤第二部分(字符串)
Sep 15 Javascript
js数组的操作详解
Mar 27 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
javascript实现简单计算器效果【推荐】
Apr 19 Javascript
vue.js加载新的内容(实例代码)
Jun 01 Javascript
vue.js实现备忘录功能的方法
Jul 10 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
PHP数据库操作面向对象的优点
2006/10/09 PHP
PHP出错界面
2006/10/09 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
joomla数据库操作示例代码
2016/01/06 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
php获取linux命令结果的实例
2017/03/13 PHP
php二维码生成以及下载实现
2017/09/28 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python之拟合的实现
2019/07/19 Python
Python安装selenium包详细过程
2019/07/23 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python 实现视频 图像帧提取
2019/12/10 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
服装销售人员求职自我评价
2013/09/26 职场文书
银行职员思想汇报
2013/12/31 职场文书
大三学习计划书范文
2014/05/02 职场文书
毕业生求职信
2014/06/10 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers