这是一款极简洁的表单校验插件,仅50行代码,属于半封装模式,可任意编写业务逻辑代码,核心代码如下:
(function(){
// 校验插件
if(!$.fn.hasOwnProperty('verify')){
$.fn.verify = function(config) {
var fields = [], item;
if (!config) return;
// 判断是否函数
function isFunction(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
}
// 表单提交校验(全部)
function handleSubmit() {
var i, errors = false, len = fields.length;
for (i = 0; i < len; i++) {
if (!fields[i].testValid()) errors = true;
}
if (errors) return false;
if (isFunction(config.success)) return config.success();
}
function process(opts, selector) {
var field = $(selector),
error = {message: opts.message || ''},
errorEl = config.errorTemplate(error);
// 将单个input事件对象追加到数组中,提交表单时遍历执行
fields.push(field);
// 核心处理方法
field.testValid = function testValid() {
var temp, error, el = $(this), val = el.val();
error = !opts.test(val);
if (error) {
el.after(errorEl);
return false;
} else {
temp = errorEl.get(0);
temp.parentNode && temp.parentNode.removeChild(temp);
return true;
}
};
// 单个input元素注册失焦事件
field.on('blur', field.testValid);
}
// 遍历对象
for(item in config.fields) {
process(config.fields[item], item)
}
// 提交按钮注册事件
if (config.submitButton) {
$(config.submitButton).click(handleSubmit);
} else {
this.on('submit', handleSubmit);
}
// 返回集合,供调用
return fields;
}
}
})();
插件调用方法如下:
(function(){
// 注册校验
$('#register').verify({
fields:{
//选中名字字段,设置校验规则
'#register input[name="phone"]':{
//错误提示信息
message:'手机号码格式不正确,请重新输入',
//校验规则,返回布尔值,true则成功,false则失败,可在此回调函数中插入您的业务逻辑,最终返回bool值就好,极方便
test:function(val){
var reg = /^(1[3-8][0-9])\d{8}$/;
return reg.test(val);
}
},
'#register input[name="password"]':{
message:'请输入正确格式的密码',
test: function (val) {
if (!val) return false;
var reg = /^[a-zA-Z0-9]{6,20}$/;
return reg.test(val);
}
},
'#register input[name="repassword"]':{
message:'两次密码输入不一致!',
test:function(val){
var password = $('input[name="password"]').val();
if(password != val) {
return false;
} else {
return true;
}
}
}
},
// 错误模板,设置装载错误信息的容器,插入上面设置的错误提示信息
errorTemplate:function(error){
return $('<div class="wrong">' + error.message + '</div>');
},
//校验成功后的回调方法,可插入校验成功后要执行的逻辑代码
success:function(){
//coding~~
}
//表单提交按钮,若未设置,则为默认的form.submit;
submitButton: '#register .submit'
});
})
原本是想在插件内封装一些固定的表单校验方法,但后来发现各种业务需求千奇百怪,简直众口难调,固以此方式呈现,只封装通用的校验流程,业务逻辑自行穿插,美其名曰:”半封装“,具体优劣各位看官自行研究了,当然,更希望您能够分享自己的见解~~
下附传送门,详细测试demo请自行跳转下载,不谢!
https://github.com/cloverso/verify