js身份证号码验证(小程序版)

时间:2021-11-02 23:02:52

参考知乎专栏文章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
})
}, })