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 相关文章推荐
JS构建页面的DOM节点结构的实现代码
Dec 09 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
网站接入QQ登录的两种方法
Jul 22 Javascript
JQuery仿小米手机抢购页面倒计时效果
Dec 16 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
Feb 06 Javascript
bootstrap实现弹窗和拖动效果
Jan 03 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
对vue.js中this.$emit的深入理解
Feb 23 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
May 21 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
vue实现移动端拖动排序
Aug 21 Javascript
基于vuex实现购物车功能
Jan 10 Vue.js
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 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
php安装swoole扩展的方法
2015/03/19 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
JS Array对象入门分析
2008/10/30 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
理解javascript异步编程
2016/01/27 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
Python标准库与第三方库详解
2014/07/22 Python
Python动态加载模块的3种方法
2014/11/22 Python
python实现一次创建多级目录的方法
2015/05/15 Python
浅谈python之新式类
2018/08/12 Python
python如何读取bin文件并下发串口
2019/07/05 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
初中英语教学反思
2014/01/25 职场文书
交通安全寄语大全
2014/04/08 职场文书
销售辞职信范文
2015/03/02 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
三八妇女节致辞
2015/07/31 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书