js校验身份证

1

<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix="rdp" uri="http://www.szfesc.cn/rdp" %>

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>新增客户黑名单信息</title>
<script type="text/javascript">
    //去掉无证件下拉选择项
    $(document).ready(function() {
        $('#certTypes option[value="00"]').remove();
    });
    
    //提交表单时校验
    function checkSubForm(){
        var obj = $('#myForm'),
            certyType = $.trim($('#certTypes option:selected').val()),
            chgflag = false;
        console.log(certyType);
        //验证身份证格式
        if(certyType == '01'){
            var idcard = $.trim($('#certno').val());
            if(idcard.length !=0 ){
                chgflag = isIdCardNo(idcard)
            }
            if(!chgflag){
                $('#certno').focus();
                return false;
            }
        }
        obj.submit();
        return true;
    }
</script>
</head>
<body>
    <div class="row">
        <div class="panel panel-default">
            <div class="panel-heading">
                <span class="glyphicon glyphicon-plus"></span>
                新增客户黑名单信息
            </div>
            
            <div class="panel-body">
                <form class="form-horizontal rdpForm" role="form" id="myForm"
                    action="${ctx }/riskmgr/custblacklist/create" method="post" enctype="multipart/form-data">
                    <div class="form-group">
                        <label for="certtype" class="col-sm-2 control-label"><span>*</span>
                            证件类型</label>
                        <div class="col-sm-3">
                            <rdp:dictForm class="form-control" sectionId="certType" required="true"
                                selectedValue="${cblParam.certtype }" name="certtype"  id="certTypes"
                                emptyOptionLabel="----请选择----"  showValue="false" emptyOption="false"/>
                        </div>
                        <rdp:token />
                    </div>
                    <div class="form-group">
                        <label for="certno" class="col-sm-2 control-label"><span>*</span>
                            证件号</label>
                        <div class="col-sm-3">
                            <input type="text" class="form-control" name="certno" id="certno"
                                placeholder="证件号" required numberLetter="true"
                                lengthlimit="32" value="${cblParam.certno }">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="clientname" class="col-sm-2 control-label"><span>*</span>
                            姓名</label>
                        <div class="col-sm-3">
                            <input type="text" class="form-control" name="clientname"
                                placeholder="姓名" required
                                lengthlimit="120" value="${cblParam.clientname }">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="reasoncode" class="col-sm-2 control-label"><span>*</span>
                            录入原因码</label>
                        <div class="col-sm-3">
                            <rdp:dictForm sectionId="custBlacklistReasonCode" required="true" class="form-control" 
                                name="reasoncode" selectedValue="${cblParam.reasoncode}" 
                                emptyOptionLabel="----请选择----" emptyOption="false"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="blackreason" class="col-sm-2 control-label"><span>*</span>
                            录入原因</label>
                        <div class="col-sm-8">
                            <textarea rows="3"  class="form-control" name="blackreason" required="true"  lengthlimit="512" placeholder="只允许输入不超过512个字符!">${cblParam.blackreason }</textarea>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="context" class="col-sm-2 control-label">附件<a href="#" onclick="addFileInput();" title="新增附件" ><span class="glyphicon glyphicon-plus"></span></a></label>
                        <div class="col-sm-8">
                            <input type="hidden" name="filetype" value="11"/>
                            <input type="file" multiple="multiple" class="form-control" filetype="*.pdf;*.txt;*.doc;*.docx;*.xls;*.xlsx;*.jpg;*.jpeg;*.gif;*.png;*.bmp" name="uploadfile" placeholder="附件" value="" />
                            <span id="fileLabelId" style="color:#7B7B7B;">支持格式:*.pdf;*.txt;*.doc;*.docx;*.xls;*.xlsx;*.jpg;*.jpeg;*.gif;*.png;*.bmp;限制100M以内。</span>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="memo" class="col-sm-2 control-label">备注</label>
                        <div class="col-sm-8">
                            <textarea rows="5" cols="10" class="form-control" name="memo" lengthlimit="254" placeholder="只允许输入不超过254个字符!">${sysParam.memo }</textarea>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-success" onclick="return checkSubForm();">保存</button>
                            <a href="${ctx }/riskmgr/custblacklist?${qryStr}" class="btn btn-default">取消</a>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</body>
</html>

1

/**
 * 身份证认证
 * @param {Object} num
 * @return {TypeName} 
 */
function isIdCardNo(num){   
   num = num.toUpperCase();   
   //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。    
   if (!(/(^d{15}$)|(^d{17}([0-9]|X)$)/.test(num))){  
       alert('输入的身份证号长度不对,或者号码不符合规定!
15位号码应全为数字,18位号码末位可以为数字或X。');  
      return false;  
   }  
    //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。  
    //下面分别分析出生日期和校验位  
    var len, re;  
    len = num.length;  
    if (len == 15){  
        re = new RegExp(/^(d{6})(d{2})(d{2})(d{2})(d{3})$/);  
        var arrSplit = num.match(re);  
        //检查生日日期是否正确  
        var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);  
        var bGoodDay;  
        bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));  
        if(!bGoodDay){  
            alert('身份证号码日期格式不正确!');    
            return false;  
        }else{  
            //将15位身份证转成18位  
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。  
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);  
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');  
            var nTemp = 0, i;    
            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);  
            for(i = 0; i < 17; i ++){  
                nTemp += num.substr(i, 1) * arrInt[i];  
            }  
            num += arrCh[nTemp % 11];    
            return num;    
        }    
    }  
    if (len == 18){  
        re = new RegExp(/^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X)$/);  
        var arrSplit = num.match(re); 
        //检查生日日期是否正确  
        var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);  
        var bGoodDay;  
        bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));  
        if (!bGoodDay){  
            alert('身份证号码日期格式不正确!');  
            return false;  
        }else{  
            //检验18位身份证的校验码是否正确。  
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。  
            var valnum;  
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);  
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');  
            var nTemp = 0, i;  
            for(i = 0; i < 17; i ++){  
                nTemp += num.substr(i, 1) * arrInt[i];  
            }  
            valnum = arrCh[nTemp % 11];  
            if (valnum != num.substr(17, 1)) {  
                alert('18位身份证的校验码不正确!应该为:' + valnum);  
                return false;  
            }  
        return num;  
        }  
    }  
    return true;  
}

1

原文地址:https://www.cnblogs.com/lixuwu/p/6206422.html