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 相关文章推荐
function, new function, new Function之间的区别
Mar 08 Javascript
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 jQuery
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 Javascript
Vuex模块化应用实践示例
Feb 03 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
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
PHP调用其他文件中的类
2018/04/02 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
javascript date格式化示例
2013/09/25 Javascript
js单例模式详解实例
2013/11/21 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
python统计中文字符数量的两种方法
2019/01/31 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Django框架表单操作实例分析
2019/11/04 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
2014年国培研修感言
2014/03/09 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
小时代观后感
2015/06/10 职场文书
农村老人去世追悼词
2015/06/23 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
Oracle锁表解决方法的详细记录
2022/06/05 Oracle