function checkIdCard(){
    var vcity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"},
      card = $('#card_no').val(),
      errorwrap=$('#card_no').parent().next();
    if(card===''){//是否为空
      errorwrap.html('<i class="icon_no"></i><em class="c_error">请输入身份证号,身份证号不能为空</em>');
      document.getElementById('card_no').focus;
      return false;
    }     if(isCardNo(card) === false){//校验长度,类型
      errorwrap.html('<i class="icon_no"></i><em class="c_error">您输入的身份证号码不正确,请重新输入</em>');
      document.getElementById('card_no').focus;
      return false;
    }     if(checkProvince(card) === false){//检查省份
      errorwrap.html('<i class="icon_no"></i><em class="c_error">您输入的身份证号码不正确,请重新输入</em>');
      document.getElementById('card_no').focus;
      return false;
    }
    if(checkBirthday(card) === false){//校验生日
      errorwrap.html('<i class="icon_no"></i><em class="c_error">您输入的身份证号码生日不正确,请重新输入</em>');
      document.getElementById('card_no').focus();
      return false;
    }     if(checkParity(card) === false){//检验位的检测
      errorwrap.html('<i class="icon_no"></i><em class="c_error">您的身份证校验位不正确,请重新输入</em>');
      document.getElementById('card_no').focus();
      return false;
    }
    errorwrap.html('<i class="icon_yes"></i>');
    return true;
  
      //检查号码是否符合规范,包括长度,类型
      function isCardNo(card){//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
        var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
        if(reg.test(card) === false){
          return false;
        }
        return true;
      }        //检查生日是否正确       function checkBirthday(card){
        var len = card.length;
        //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
        if(len == '15'){
            var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/,
              arr_data = card.match(re_fifteen),
              year = arr_data[2],
              month = arr_data[3],
              day = arr_data[4],
              birthday = new Date('19'+year+'/'+month+'/'+day);
            return verifyBirthday('19'+year,month,day,birthday);
        }
        //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
        if(len == '18'){
            var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/,
              arr_data = card.match(re_eighteen),
              year = arr_data[2],
              month = arr_data[3],
              day = arr_data[4],
              birthday = new Date(year+'/'+month+'/'+day);
            return verifyBirthday(year,month,day,birthday);
        }         return false;       }
      //校验日期
      function verifyBirthday(year,month,day,birthday){
        var now = new Date();
        var now_year = now.getFullYear();
        //年月日是否合理
        if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day){
          //判断年份的范围(3岁到100岁之间)
          var time = now_year - year;
          if(time >= 3 && time <= 100){
            return true;
          }
          return false;
        }
        return false;
      }       //取身份证前两位,校验省份
      function checkProvince(card){
        var province = card.substr(0,2);
        if(vcity[province] == undefined){
          return false;
        }
        return true;
      }        //校验位的检测
      function checkParity(card){
        //15位转18位
        card = changeFivteenToEighteen(card);
        var len = card.length;
        if(len == '18'){
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2),
            arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'),
            cardTemp = 0,
            i,
            valnum;
          for(i = 0; i < 17; i ++){
            cardTemp += card.substr(i, 1) * arrInt[i];
          }
          valnum = arrCh[cardTemp % 11];
          if (valnum == card.substr(17, 1)){
            return true;
          }
          return false;
        }
        return false;
      }       //15位转18位身份证号
      function changeFivteenToEighteen(card){
        if(card.length == '15'){
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2),
            arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'),
            cardTemp = 0,
            i;
          card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
          for(i = 0; i < 17; i ++){
            cardTemp += card.substr(i, 1) * arrInt[i];
          }
          card += arrCh[cardTemp % 11];
          return card;
        }
        return card;
      }
  }

  

[JavaScript] js验证身份证的更多相关文章

  1. Js完美验证15/18身份证,Js验证身份证,支持15/18位

    Js完美验证15/18身份证,Js验证身份证,支持15/18位 >>>>>>>>>>>>>>>>> ...

  2. javascript实现验证身份证号的有效性并提示

    javascript实现验证身份证号的有效性并提示 function nunber(allowancePersonValue){ if(allowancePersonValue=="身份证号 ...

  3. js验证身份证号,超准确

    js验证身份证号,超准确 看程序前先来了解下身份证号的构成:身份证号分为两种,旧的为15位,新的为18位.身份证15位编码规则:dddddd yymmdd xx p    其中 dddddd:地区码  ...

  4. JS验证身份证

    话不多说,直接看代码 JS部分 /** * 身份证15位编码规则:dddddd yymmdd xx p * dddddd:地区码 * yymmdd: 出生年月日 * xx: 顺序类编码,无法确定 * ...

  5. 如何用javascript正则表达式验证身份证号码是否合法

    在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客.下面就此实现方法给大家讲解下. 很多时候我们都是通过一组正则表达式来判断用户输入的身份 ...

  6. JS验证身份证的合法性

    //验证身份证的合法性 function IdentityCodeValid(code) { var city={11:"北京",12:"天津",13:&quo ...

  7. js验证身份证号码是否合规

    需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...

  8. js、javascript正则表达式验证身份证号码

    function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{1 ...

  9. JS验证身份证号码合法性

    <html><head><script type="text/javascript">    function validateCard(){  ...

随机推荐

  1. Jersey(1.19.1) - XML Support

    As you probably already know, Jersey uses MessageBodyWriters and MessageBodyReaders to parse incomin ...

  2. MySql索引的优缺点

    优点 有了索引.对于记录数量很多的表,可以提高查询速度. 缺点 索引是占用空间的. 索引会影响update insert delete速度 ALERT!!! 1.索引要创建在where和join用到的 ...

  3. MySQL之经典语句

    数据库的创建:(例如创建名为ConstructionDB的数据库) --创建SelfStudy数据库 CREATE DATABASE ConstructionDB ON PRIMARY --创建主数据 ...

  4. CSS之照片翻转

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  5. R语言diagram包画订单状态流图

    代码如下: library("diagram") #a <- read.table(file="clipboard",header=TRUE) write ...

  6. (转)C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)

    一.C# vs SQLite: C# SQLite 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool BIT NOT NULL Boolean F_BOOL_N ...

  7. 谈谈css中的before和after

    css中的伪元素before和after,其实有很多小的妙用. 一.基础用法 w3c中的基础用法:用来给元素的内容前面(对应:before)或者后面(对应:after)插入新内容. <p> ...

  8. windows下配置Apache2.4一些改变

    下载地址: http://www.apachelounge.com/download/http://www.apachehaus.com/cgi-bin/download.plx Apache更新到2 ...

  9. Windows Phone开发之”给我好评“

        课余时间搞了一年的Windows phone开发,最近又开始重拾C#编程之道,之前下载许多应用都有"给我好评"的界面,那个时候自己的应用都没有这个界面,于是到处百度谷歌,却 ...

  10. xamarin android——数据绑定到控件(二)

    本示例为通过媒体内容提供器获取本机中的图片显示在Gallery中. 活动中简单的初始化代码 private void InitGallery() { Gallery gallery = FindVie ...