js身份证号码验证,小程序版

参考知乎专栏文章https://zhuanlan.zhihu.com/p/22949023

<view class=\'bgw\'>
  <form>
......
    <view class=\'ipt-wrapper\'>
      <view class=\'ipt-l\'>身份证</view>
      <view class=\'ipt-r\'>
        <input type=\'text\' placeholder=\'请输入您的身份证号\' name="idcard" value=\'{{idcard}}\' bindinput="bindIdcard"/>
        <image src=\'{{icon}}\' class=\'right-arrow\'></image>
      </view>
    </view>
  .....
  </form>
</view>
<view class=\'submit\' bindtap=\'submit\'>提交预约</view>
<!-- 弹出层 -->
<view class=\'mask\' wx:if="{{maskState}}" bindtap=\'hidelayer\'></view>
<!-- 表单出错 -->
<view class=\'layer\' wx:if="{{warnState}}"> 
  <image src=\'{{excitedicon}}\' class=\'infoicon\'></image>
  <view class=\'info\'>{{errorinfo}}</view>
  <view class=\'btn-small\' bindtap=\'hidelayer\'>好的</view>
</view>
....
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]; 
Page({

  /**
   * 页面的初始数据
   */
  data: {
    name: \'\',
    phone: \'\',
    idcard: \'\',
    errorinfo: \'\',
    maskState: false,
    warnState: false,

  },
  // 关闭弹出层
  hidelayer:function(){
    this.setData({
      maskState: false,
      warnState: false,
      errState: false,
      okState: false
    })
  },
  // 表单提交
  submit:function(){
    var  idcard = this.data.idcard;
    var reg = /^1\d{10}$/;

    if (this.isBlank(idcard)) {
      this.setData({
        maskState: true,
        warnState: true,
        errorinfo: \'身份证号不能为空\'
      })
      return
    }
    if (!this.IdCardValidate(idcard)){
      this.setData({
        maskState: true,
        warnState: true,
        errorinfo: \'身份证号格式错误\'
      })
      return
    }
    
    
    
  },
  IdCardValidate:function (idCard) { 
    idCard = this.trim(idCard.replace(/ /g, ""));               //去掉字符串头尾空格                     
    if(idCard.length == 15) {
      return this.isValidityBrithBy15IdCard(idCard);       //进行15位身份证的验证    
    } else if (idCard.length == 18) {
      var a_idCard = idCard.split("");                // 得到身份证数组   
      if (this.isValidityBrithBy18IdCard(idCard) && this.isTrueValidateCodeBy18IdCard(a_idCard)) {   //进行18位身份证的基本验证和第18位的验证
        return true;
      } else {
        return false;
      }
    } else {   
      return false;   
    }
  },
/**  
 * 判断身份证号码为18位时最后的验证位是否正确  
 * @param a_idCard 身份证号码数组  
 * @return  
 */  
isTrueValidateCodeBy18IdCard:function(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];            // 加权求和   
    }
    var valCodePosition = sum % 11;                // 得到验证码所位置   
    if (a_idCard[17] == ValideCode[valCodePosition]) {
      return true;
    } else {
      return false;
    }
  },
/**  
  * 验证18位数身份证号码中的生日是否是有效生日  
  * @param idCard 18位书身份证字符串  
  * @return  
  */  
isValidityBrithBy18IdCard:function (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  
   */  
  isValidityBrithBy15IdCard:function (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;
    }
  },
  //去掉字符串头尾空格   
  trim:function (str) {
    return str.replace(/(^\s*)|(\s*$)/g, "");
  },
  // 判断是否为空
  isBlank:function(_value) {
    if (_value == null || _value == "" || _value == undefined) {
      return true;
    }
    return false;
  },
  bindIdcard: function (e) {
    this.setData({
      idcard: e.detail.value
    })
  },
 

 
  
})