最近寫了無數各種形式的表單,記錄下奇奇怪怪的校驗規則~
一:首先是element自帶的rules校驗規則:
element作為常用框架,自帶rules屬性簡單易懂,官方文件一目瞭然,不再贅述,應付常用校驗足夠了,
相對麻煩的是自定義的校驗函式,舉個例子:
html部分:
1 <el-form id="form" 2 :rules="rules" 3 :inline="true" 4 :model="form" 5 size="medium" 6 ref="form" 7 label-position="right" 8 label-width="136px" 9 validate-on-rule-change 10 class="postForm" autocomplete="off" inline-message> 11 <el-form-item prop="phone"> 12 <el-input v-model="form.phone" name="phone" id="phone" size="medium" required> 13 </el-input> 14 </el-form-item> 15 <el-form-item prop="money"> 16 <el-input v-model="form.money" name="money" id="money" size="medium" required> 17 </el-input> 18 </el-form-item> 19 </el-form>
下面是js部分:
1 rules:{ 2 phone: [ 3 { required: true, message: '請輸入手機號碼', trigger: 'blur' }, 4 { validator:function(rule,value,callback){ 5 if(/^1[34578]\d{9}$/.test(value) == false&&/^\d{4}-?\d{4}$/.test(value) == false){ 6 callback(new Error("請輸入正確的手機號或電話號碼")); 7 }else{ 8 callback(); 9 } 10 }, trigger: 'blur' 11 } 12 ], 13 money: [ 14 {required: true, message: '請輸入金額', trigger: 'change'}, 15 { validator:function(rule,value,callback){ 16 let num=Number(me.numRep)+Number(me.meetingForm.numWork) 17 if(/^\d+(\.\d{1,6})?$/.test(value) == false){ 18 callback(new Error("最長可輸入6位小數點,系統限制最大不能超過 550*總人數/10000")); 19 }else if(Number(value) >num*550/10000){ 20 callback(new Error("最長可輸入6位小數點,系統限制最大不能超過 550*總人數/10000")); 21 } 22 else{ 23 callback(); 24 } 25 }, trigger: 'blur'} 26 ] 27 }
接下來是呼叫:
1 formValidate(formName){ 2 this.$refs[formName].validate((valid) => { 3 if(valid) { 4 this.validateForm=true; 5 }else{ 6 this.$message.warning("請確認輸入資訊無誤!"); 7 this.validateForm=false; 8 } 9 }); 10 return this.validateForm; 11 },
二:接下來也是比較常用的,jQuery+easyUI 的表單校驗:
依舊直接上例子:
html部分:
1 <form id="formA" class="postForm" autocomplete="off"> 2 <table role="table" class="desigerTable" data-usage="基本資訊錄入" id="t5" cellpadding="10" cellspacing="10"> 3 <tbody> 4 <tr> 5 <td class="targetarea droppable"> 6 <div data-type="1"> 7 <div class="form-group"> 8 <label class="col-sm-4 control-label">總天數</label> 9 </div> 10 </div> 11 </td> 12 <td class="targetarea droppable"> 13 <div data-type="1" class="wrapper"> 14 <div class="form-group"> 15 <input class="form-control" placeholder="" id="days" 16 name="days" type="text"> 17 </div> 18 </div> 19 </td> 20 <td class="targetarea droppable"> 21 <div data-type="1"> 22 <div class="form-group"> 23 <label class="col-sm-4 control-label">總人數</label> 24 </div> 25 </div> 26 </td> 27 <td class="targetarea droppable" colspan="2"> 28 <div data-type="1" class="wrapper"> 29 <div class="form-group"> 30 <input class="form-control" placeholder="" id="person" 31 name="person" type="text"> 32 </div> 33 </div> 34 </td> 35 </tr> 36 </tbody> 37 </table> 38 </form>
js部分:
1 /** 2 * 校驗主表單 3 */ 4 var formValidate = function () { 5 //表單驗證規則 6 $("#formA").validate({ 7 ignore: "", 8 rules: { 9 days: {required: false,number: true,checkDur:true}, 10 person: {required: false,number: true,checkPerson:true}, 11 }, 12 messages: { 13 days: { 14 number: "請輸入數字", 15 checkDays:"*總天數不超過2天,可輸入小數,0.5,1,1.5!" 16 }, 17 person: { 18 number: "請輸入數字", 19 checkPerson:"*請輸入正整數!" 20 }, 21 }, 22 //是否在獲取焦點時驗證 23 onfocusout:false, 24 //是否在敲擊鍵盤時驗證 25 onkeyup:false, 26 //提交表單後,(第一個)未通過驗證的表單獲得焦點 27 focusInvalid:true, 28 //當未通過驗證的元素獲得焦點時,移除錯誤提示 29 focusCleanup:true, 30 }); 31 $.validator.addMethod("checkDays",function(value,element){ 32 if(value == 0.5||value == 1||value == 1.5||value == 2){ 33 return this.optional(element)||true 34 } 35 },"*總天數不超過2天,可輸入小數,0.5,1.5!"); 36 $.validator.addMethod("checkPerson",function(value,element){ 37 var me = /(^[1-9]\d*$)/; 38 return this.optional(element)||(me.test(value)); 39 },"*請輸入正整數!"); 40 /** 41 * 校驗方法呼叫 42 */ 43 var dataValidate = function (data) { 44 if (!$("#formA").valid()) { 45 Util.alert("請輸入正確的資料!"); 46 return false; 47 } 48 return data; 49 };
三:原生js form表單校驗:
原生js校驗可直接呼叫onclick,onfocus,onblur,onkeyup等事件來實現
(ps:原生真的永遠的神,沒有什麼是原生js做不到的,如果做不到,就是我太菜了,繼續滾去學原生。。)
繼續簡單明瞭舉例子:
html部分:
1 <form action="example.html" method="post" enctype="multipart/form-data" class="register"> 2 <div> 3 <label for="idCode">身份證號</label> 4 <input type="text" id="idCode" class="idCode" name="idCode" placeholder="身份證號"/> 5 </div> 6 <div> 7 <label for="passwd">密碼</label> 8 <input type="passwd" name="passwd" id="passwd" class="passwd" placeholder="密碼"/> 9 </div> 10 </form>
js部分:
1 onload = function () { 2 blurElement(); 3 submitForm(); 4 } 5 //元素失去焦點時校驗 6 function blurElement() { 7 //驗證姓名 8 document.getElementById("ame").onblur = function () { 9 vailidateName(); 10 }; 11 12 //表單提交函式 13 function submitForm() { 14 let form = document.getElementsByClassName("register")[0]; 15 form.onsubmit = function (e) { 16 let flag =vailidateName()& vailidatePasswd()& vailidateID(); 17 return flag == 1 ? true : false; 18 }; 19 } 20 //驗證身份證號碼 18位 21 function vailidateID() { 22 let id = document.getElementById("idCode"); 23 let span = next(id); 24 let value = id.value; 25 //判斷空 26 if (value == "") { 27 span.innerHTML = "身份證號碼不能為空"; 28 span.style.color = "red"; 29 return false; 30 } 31 //判斷長度 32 if (value.length != 18) { 33 span.innerHTML = "身份證號碼長度18位"; 34 span.style.color = "red"; 35 return false; 36 } 37 //判斷前17位數字 38 let reg = /^\d{17}$/; 39 let str = value.substring(0, 17); 40 if (!reg.test(str)) { 41 span.innerHTML = "身份證號碼前17位必須是數字"; 42 span.style.color = "red"; 43 return false; 44 } 45 //驗證密碼:6-12位非空,必須包含大寫字元,字母開頭 46 function vailidatePasswd() { 47 let passwd = document.getElementById("passwd"); 48 let span = next(passwd); 49 let value = passwd.value; 50 let code = /^[a-zA-Z]$/; 51 //非空 52 if (value == "") { 53 span.innerHTML = "密碼不能為空"; 54 span.style.color = "red"; 55 return false; 56 } 57 }
ok,結束,以上就是最近寫的典型的前端校驗表單例子,還在跟需求battle新的校驗。。接下來都是更讓人吐血的動態校驗,寫完了再更。。。