這個插件主要是爲了解決vee-validata在使用中沒有有驗證的地方要單獨去寫不少驗證樣式的標籤以及一些不方便實現的一些驗證的樣式 好比這樣子:前端
/插件源碼*/
/**promise
*/app
import zh from 'vee-validate/dist/locale/zh_CN';
import { Validator } from 'vee-validate'
Validator.localize('zh',zh);
const isPhone = {dom
getMessage:(field, params, data) => { return field + '格式錯誤'; }, validate: value => { if(value==undefined){ value='' } return value.length == 11 && /^((13|14|15|17|18)[0-9]{1}\d{8})$/.test(value) }
}
const isPassword ={ui
getMessage:(field, params, data) => { return field + '密碼6-16位,不包含特殊字符,能夠是數字或者字母'; }, validate: value => { if(value==undefined){ value='' } return value == value && value.length > 5; }
}this
const isEmail ={spa
getMessage:(field, params, data) => { return field + '格式錯誤'; }, validate: value => { if(value==undefined){ value='' } return value == value && /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(value); }
}prototype
Validator.extend('password', isPassword);
Validator.extend('phone', isPhone);
Validator.extend('email', isEmail);插件
Validator.localize({code
zh: { messages: { required: function (name) { return name + '不能爲空' }, }, attributes: { phone: '手機號', password:'密碼', email:'郵箱' } }
})
const validator = new Validator({
phone: 'required|phone', password: 'required|password', email:'required|email',
});
/**
*/
const FishVer = function(){
this.init = function(verArr,callback,id){ verArr.forEach((el,index)=>{ var inputDom = getElementByAttr('form-control','name',el.name,id); inputDom.forEach((eldom,ind)=>{ eldom.addEventListener('input',(event,e)=>{ regValue(el,eldom).then(res=>{ verArr[index].ver = res callback(checkVerAll(verArr)) }) }) }) }) }
}
/**
*/
FishVer.prototype.fishVerAll = function(verArr,callback,id){
let promises = []; for(let i=0;i<verArr.length;i++){ var inputDom = getElementByAttr('form-control','name',verArr[i].name,id); promises.push(regValue(verArr[i],inputDom[0])) } return Promise.all(promises).then(res=>{ callback(checkVerArrAll(res)) })
}
/**
*/
function checkVerAll(value){
let isAll = false; for(let i=0;i<value.length;i++){ if(value[i].ver){ isAll = true; continue; }else{ isAll = false; break; } } return isAll;
}
/**
*/
function checkVerArrAll(value){
let isAll = false; for(let i=0;i<value.length;i++){ if(value[i]){ isAll = true; continue; }else{ isAll = false; break; } } return isAll;
}
/**
*/
function getElementByAttr(tag, dataAttr, reg,id) {
var idEle = document.getElementById(id); var aElements = idEle.getElementsByClassName(tag); var aEle = []; for(var i = 0; i < aElements.length; i++) { var ele = aElements[i].getAttribute(dataAttr); if(ele == reg) { aEle.push(aElements[i]); } } return aEle;
}
function regValue(el,inputDom){
return new Promise((resolve,reject)=>{ validator.validate(el.name,inputDom.value).then((res)=>{ let inputDomFather = inputDom.parentNode; let hasError = inputDomFather.getElementsByClassName('ver_error'); if(validator.errors.has(el.name)){ //若是驗證不經過 removeClass(inputDom,'ver_success'); removeClass(inputDom,'ver_fail'); addClass(inputDom,'ver_fail'); removeClass(inputDomFather,'ver_box_success'); removeClass(inputDomFather,'ver_box_fail') addClass(inputDomFather,'ver_box_fail'); if(hasError.length){ hasError[0].innerHTML = validator.errors.first(el.name); }else{ let errorTemp = document.createElement('span'); errorTemp.className = 'ver_error'; errorTemp.innerHTML = validator.errors.first(el.name); inputDomFather.append(errorTemp); } resolve(false) }else{ if(hasError.length){ inputDomFather.removeChild(hasError[0]); } removeClass(inputDom,'ver_fail'); removeClass(inputDom,'ver_success'); addClass(inputDom,'ver_success'); removeClass(inputDomFather,'ver_box_fail'); removeClass(inputDomFather,'ver_box_success'); addClass(inputDomFather,'ver_box_success'); resolve(true) } }).catch(err=>{ console.log(err) }) })
}
function addClass(obj,cls) {
var obj_class=obj.className, blank = ( obj_class != '' ) ? ' ' : ''; let added = obj_class + blank + cls; obj.className = added;
}
function removeClass(obj,classname){
//若是原來有class if(obj.className!=""){ var arrClassName=obj.className.split(" "); var _index=arrIndexOf(arrClassName,classname); //若是有須要移除的class if(_index!=-1){ arrClassName.splice(_index,1); obj.className=arrClassName.join(" "); } } //若是原來沒有class無操做
}
function arrIndexOf(arr,v){
for(var i=0;i<arr.length;i++){ if(arr[i]==v){ return i; } } return -1;
}
const fishVer = new FishVer();
export default fishVer;
/插件源碼*/
/*調用插件/
fishVer.init([
{name:'password'}
],(res)=>{
console.log(res)
},'logver')
<input type="password" name="password" class="form-control form-block" v-model="login_pwd" placeholder="密碼">
須要輸入框有form-control這個類 有對應的name logver 爲包含這個input 這個DOM的外層盒子的id值 這個id 保證這個一個頁面中相同的name值在不一樣的ID盒子裏進行驗證 自定義的樣式能夠在驗證後審查元素 去定義本身的樣式