css代碼: html代碼: JS調用: ...
;(function(){ /** 驗證框架 checkFun * 使用方法: * <input class="required" type="text" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確" id="" /> * 1、需要驗證的元素都加上【required】樣式,當然這個required可以當參數傳遞,也可以自定義class類名 * 2、@data-valid 驗證規則,驗證多個規則中間用【||】隔開,更多驗證規則,看rules和rule,後面遇到可繼續增加 * 3、@data-error 規則對應的提示信息,一一對應 * 調用方式 checkFun({ formId:'verifyCheck', //<驗證formId內class為required的元素 checkClass:'required', //<需要驗證的DOM元素上預設class類名> onBlur:function(el,state){console.log(state)}, //<被驗證元素失去焦點的回調函數,回調函數中包括當前輸入框失焦後是否通過驗證的狀態true表示通過,false表示未通過> onFocus:null, //<被驗證元素獲得焦點的回調函數> onChange: null, //<被驗證元值改變的回調函數> successTip: true, //<驗證通過是否提示> resultTips:null, //<顯示提示的方法,參數obj[當前元素],isRight[是否正確提示],value[提示信息]> clearTips:null //<清除提示的方法,參數obj[當前元素]> }) 下麵列舉下實現的調用 //1.實現isNonEmpty,郵箱格式isEmail <input class="required" type="text" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確" id="" /> //2.驗證最小長度minLength與最大長度maxLength <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||minLength:3" data-error="密碼不能為空||密碼長度至少為3位"/> //3驗證某個範圍內between <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/> //4.驗證兩次密碼是否輸入一致isRepeat <div class="same"> <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/> <label class="focus valid"></label> </div> <div class="same"> <input type="password" placeholder="重覆密碼" value="" class="required password2" id="password2" data-valid="isNonEmpty||isRepeat:password" data-error="密碼不能為空||兩次輸入的密碼不一致"/> <label class="focus valid"></label> </div> //5.驗證密碼強度level (使用方式跟minLength一樣 level:3) //6.驗證是否為手機號碼isPhone //7.驗證是否為純中文isZh //8.驗證身份證號碼isCard //下麵的方式原生調用方式,當然可以使用jquery觸發點擊事件 document.getElementById('submitBtn').addEventListener('click',function(){ //點擊提交按鈕時驗證 if(!checkFun.click()) return; },false) */ /** 深度拷貝 * @param p 拷貝的對象 * @param c c預設傳遞的對象,也可以不傳 * @result 返回拷貝後的對象 * */ var extendCopy = (function f(p,c){ var c = c || {}; for (var i in p) { if(typeof p[i] === 'object'){ c[i] = (p[i] instanceof Array) ? [] : {}; f(p[i],c[i]); }else{ c[i] = p[i]; } } return c; }); var opts; var checkFun = function(config){ opts = extendCopy(config || {},ValCheck.defaults); return (new ValCheck())._init(opts); } function ValCheck(){ //驗證規則 var rule = { phone:/^1\d{10}$/, email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, card:/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}(((((19|20)((\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(\d{2}(0[13578]|1[02])31)|(\d{2}02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[48])0229)))|20000229)\d{3}(\d|X|x))|(((\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(\d{2}(0[13578]|1[02])31)|(\d{2}02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[48])0229))\d{3}))$/, //身份證號 zh:/^[\u4e00-\u9fa5]+$///純中文 }; this.rules = { isNonEmpty: function(value, errorMsg) {//不能為空 errorMsg = errorMsg||" "; if (!value.length) return errorMsg; }, minLength: function(value, length, errorMsg) { //大於 errorMsg=errorMsg||" "; if (value.length < length) return errorMsg; }, maxLength: function(value, length, errorMsg) {//小於 errorMsg=errorMsg||" "; if (value.length > length) return errorMsg; }, between: function(value, range, errorMsg) {//大於小於 errorMsg=errorMsg||" "; var min = parseInt(range.split('-')[0]); var max = parseInt(range.split('-')[1]); if (value.length < min || value.length > max) return errorMsg; }, isRepeat:function(value, range, errorMsg){ //重覆密碼 errorMsg=errorMsg||" "; var curPswDomVal = document.getElementById(range).value; if(value!==curPswDomVal) return errorMsg; }, isPhone: function(value, errorMsg) { errorMsg=errorMsg||" "; if (value!=null && value!='' && !rule.phone.test(value)) return errorMsg; }, isEmail: function(value, errorMsg) { errorMsg=errorMsg||" "; if (value!=null && value!='' && !rule.email.test(value)) return errorMsg; }, level:function(value,range,errorMsg){//密碼複雜程度 errorMsg=errorMsg||" "; var r=checkFun.pwdStrong(value); if(range>4) range=3; if(r<range) return errorMsg; }, isZh: function(value, errorMsg) { errorMsg=errorMsg||" "; if (!rule.zh.test(value)) return errorMsg; }, isCard: function(value, errorMsg) { errorMsg=errorMsg||" "; if (!rule.card.test(value)) return errorMsg; }, }; } //預設配置 ValCheck.defaults = { formId:'verifyCheck', //驗證的ID checkClass:'required', //需要驗證的DOM元素上預設class類名 onBlur:null,//被驗證元素失去焦點的回調函數 onFocus:null,//被驗證元素獲得焦點的回調函數 onChange: null,//被驗證元素值改變的回調函數,回調參數為當前DOM元素 successTip: true,//驗證通過是否有提示 resultTips:null,//驗證提示的回調函數,傳回參數obj[當前元素],isRight[驗證是否通過],value[提示的值] clearTips:null //清空提示的回調函數,傳回參數obj[當前元素] }; //驗證初始化 ValCheck.prototype._init = function(config){ var self = this; self.allinputs = document.getElementsByClassName(ValCheck.defaults.checkClass); self.allinputs = Array.prototype.slice.call(self.allinputs,0); for(var item =0, len = self.allinputs.length; item < len; item++){ (function(i){ self.allinputs[i].addEventListener('blur',function(e){ e.preventDefault(); var state = self.formValidator(self.allinputs[i]); config.onBlur ? config.onBlur(self.allinputs[i],state) : ''; },false); self.allinputs[i].addEventListener('focus',function(e){ e.preventDefault(); if(config.onFocus){ config.onFocus(self.allinputs[i]); }else{ var matched = []; //存放兄弟節點 var n = (self.allinputs[i].parentNode || {}).firstChild; for(; n; n = n.nextSibling){ if(n.nodeType === 1 && n !== self.allinputs[i]){ n.innerHTML = ''; } } } },false); self.allinputs[i].addEventListener('change',function(e){ e.preventDefault(); config.onChange ? config.onChange(self.allinputs[i]) : ''; },false); })(item); } } /** 驗證規則 * @param el 當前被驗證的DOM元素 * */ ValCheck.prototype.formValidator = function(el){ var self = this; var validataString = el.getAttribute('data-valid'); if(validataString === undefined){ return false; } var validArray = validataString.split('||'); var errorString = el.getAttribute('data-error'); if(errorString === undefined){ return false; } var errorArray = errorString.split('||'); var ruleArray = []; for(var i =0, j = validArray.length; i < j; i++){ ruleArray.push({ funTitle:validArray[i], errorMsg:errorArray[i] }); } return self.validataResult(el,ruleArray); } /** 驗證結果 * @param el 驗證的DOM元素 * @param ruleArray 需要逐一驗證的數組規則 * */ ValCheck.prototype.validataResult = function(el,ruleArray){ var self = this; for(var i = 0, rule; rule = ruleArray[i++];){ var applyArgs = rule.funTitle.split(':'); var errorMsg = rule.errorMsg; var ruleFun = applyArgs.shift();//得到匹配刪除的函數名 applyArgs.unshift(el.value);// 數組第一位插入value值 applyArgs.push(errorMsg); //最後插入出錯信息 applyArgs.push(el); var result = self.rules[ruleFun].apply(el, applyArgs); if(result){ opts.resultTips ? opts.resultTips(el, false, result) : self.resultTips(el, false, result); return false; } } opts.successTip ? ( opts.resultTips ? opts.resultTips(el,true) : self.resultTips(el, true) ) : self.clearTip(el); return true; } /** 驗證信息的顯示 * @param el 當前被驗證的DOM元素 * @param isRight 驗證是否通過, false=未通過 true=驗證通過 * @param value 提示信息 * */ ValCheck.prototype.resultTips = function(el, isRight, value){ var cls = 'el_error'; var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)',"g"); value = value || ''; if(!isRight){ if(!el.className.match(reg)){ el.className += ' ' + cls; } }else{ if(el.className.match(reg)){ el.className = el.className.replace(reg,''); } } var matched = []; //存放兄弟節點 var n = (el.parentNode || {}).firstChild; for(; n; n = n.nextSibling){ if(n.nodeType === 1 && n !== el){ n.innerHTML = value; //賦值提示信息 } } }; /** 清空提示 * @param el 清空提示的DOM元素 */ ValCheck.prototype.clearTip = function(el){ var cls = 'el_error'; var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); el.className.replace(reg,''); }; /****************對外開放方法******************/ /** 外部可調用click方法,比如點擊事件時候調用checkFun.click(),驗證成功返回true * @param formId 驗證DOM為formId區域下的表單 * @result {boolen} true or false * */ checkFun.click = function(formId){ formId = formId || opts.formId; var resultObj = []; //存放需要驗證的DOM對象 var rangeobj = document.getElementById(formId); if(rangeobj.getElementsByClassName){ rangeobj = [].slice.apply(rangeobj.getElementsByClassName(ValCheck.defaults.checkClass)); }else{ var tags = rangeobj.getElementsByTagName("*"); //遍歷每個DOM元素 for(var i = 0, len = tags.length; i < len; i++){ // 獲取到當前遍歷元素所使用的所有類名 var classNames = tags[i].className.split(" "); for(var j = 0, l=classNames.length; j < l; j++){ if(classNames[j] == ValCheck.defaults.checkClass){ rangeobj.push(tags[i]); break; } } } } var check = new ValCheck(); var checkResultNumber = 0; //檢測結果,檢查通過的數目 var resultState = true; //開始驗證所有DOM元素 for(var domNumber = 0, domlen = rangeobj.length; domNumber < domlen; domNumber++){ everyResultState = check.formValidator(rangeobj[domNumber]); if(resultState){ checkResultNumber ++; } } if(checkResultNumber !== domlen ){ resultState = fasle; } return resultState; }; /** 判斷密碼強度 * @param val 當前DOM元素的value值 * @return {number} 返回數字等級 * */ checkFun.pwdStrong = function(val){ var lv=0; if(val.match(/[a-z]/g)){lv++;} if(val.match(/[A-Z]/g)){lv++;} if(val.match(/[0-9]/g)){lv++;} if(val.match(/(.[^a-z0-9A-Z])/g)){lv++;} if(lv > 4){lv=4;} if(lv===0) return false; return lv; } window.checkFun = checkFun; })();
css代碼:
.same{margin-bottom: 30px;position:relative;} .same input{border:1px solid #ccc;width:200px;height:30px;line-height: 30px;padding-left:10px;} .valid{color:red;position:absolute;} .submitBtn{cursor: pointer;}
html代碼:
<div id="verifyCheck"> <div class="same"> <input type="text" placeholder="郵箱" value="" class="required email" id="email" data-valid="isNonEmpty||isEmail" data-error="email不能為空||郵箱格式不正確"/> <label class="focus valid"></label> </div> <div class="same"> <input type="password" placeholder="密碼" value="" class="required password" id="password" data-valid="isNonEmpty||between:3-5" data-error="密碼不能為空||密碼長度在3-5位"/> <label class="focus valid"></label> </div> <div class="same"> <input type="password" placeholder="重覆密碼" value="" class="required password2" id="password2" data-valid="isNonEmpty||isRepeat:password" data-error="密碼不能為空||兩次輸入的密碼不一致"/> <label class="focus valid"></label> </div> <button class="submitBtn" id="submitBtn">提交</button> </div>
JS調用:
checkFun({ onBlur:function(el,state){ console.log($(el)); } }); document.getElementById('submitBtn').addEventListener('click',function(){ checkFun.click(); },false)