(function(window,undifined,$){
$.fn.extend({
validForm:function(options){
//示例:<input type="text" allattr="isrequired,dcard,limit=6-20">
//验证规则blooean
//allAttr 为验证元素添加的属性,一下参数添加到次属性中并用","分割开
//比如 有长度限制 <input type="text" allattr="isrequired,dcard,limit=6-20">
// limit=6-20,表示长度限制,6到20个字符包含6和20
// 无长度显示 <input type="text" allattr="isrequired,idcard">
// 无isrequired但是有对应的其他正则验证 如果该标签为空值跳过,有值则会进行对应的正则验证
// 如,<input type="text" allattr="idcard">
//isrequired 添加了此属性表示为必填项
//allattr中的名称必须与规定的正则名称对应否则无法进行验证,报错:无对应的验证表达式,请添加对应的正则表达式
//thisForm * 当前验证的所有表单元素的直接父级元素jquery选择器
//callback 验证成功之后的回调函数,提交表单的代码可以放此函数中
//对应的正则表达式,根据具体的验证场景,进行补充添加
//如果有radio,checkbox的验证,每个元素添加data-field属性并赋值,每组data-filed值相同的input必须对应一个隐藏域,隐藏域的id是data-field属性值
//实例中的样式,可根据业务修改
options = options || {};
options.thisForm = options.thisForm;
var _this = this;//验证表单的对象
var reg = {
isrequired : {expression:/.+/,errorMsg:"不能为空"},
idcard : {expression:/^\d{15}(\d{2}[A-Za-z0-9])?$/,errorMsg:"格式不正确"},
mobile : {expression:/^(1[3|5|8]{1}\d{9})$/,errorMsg:"格式不正确"},
chinese : {expression:/^[\u0391-\uFFE5]+$/,errorMsg:"仅支持中文字符"},
english : {expression:/^[A-Za-z]+$/,errorMsg:"仅支持英文字符"},
number : {expression:/^-?(\d+|[1-9]\d*\.\d+|0\.\d*[1-9]\d*|0?\.0+|0)$/,errorMsg:"仅支持数字"},
email : {expression:/^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,errorMsg:"Email格式不正确"},
telephone : {expression:/^(((0\d{2,3}-)?\d{7,8}(-\d{4})?))$/,errorMsg:"电话号码格式不正确"},
url:{expression : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,errorMsg:"URL地址格式不正确"},
regex : {errorMsg:"格式不正确"},
unsafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
issafe : function(str){return !this.UnSafe.test(str);},
safestring : {expression:"this.IsSafe(value)",errorMsg:"仅支持中文字符"},
erroritem : [document.forms[0]],
errormessage : ["以下原因导致提交失败:\t\t\t\t"],
integers : {expression:/^-?\d+$/,errorMsg:"仅支持整型数字"},
twoDecimalPlaces:{expression:/^([1-9]\d*|0)(\.\d+)?$/,errorMsg:"仅支持数字"},
decimal:{expression:/^(0\.\d+|1)$/,errorMsg:"仅支持0到1之间的数"},
mapListReg:{expression:/^[a-zA-Z][a-zA-Z0-9_]*$/,errorMsg:"只能由字母、数字、下划线,并且字母开头"},
isBlooean:{expression:function(self){
var val = self.val();
if(val === 'true' || val === 'false' || val === true || val === false){
self.css({'border':''});
self.attr('isflag',true);
return true;
}else{
self.attr('isflag',false);
return false;
}
},errorMsg:"仅支持Blooean类型"},
stringArr:{expression:function(self, eachExp){
var val = self.val();
self.css({'border':''});
self.attr('isflag',true);
return true;
},errorMsg:"仅支持字符串数组,英文‘,’分隔"},
twoDecimalPlacesArr:{expression:function(self, eachExp){
var val = self.val();
if(val.indexOf(',')===-1){
if(reg.getObjectType(val)){
self.attr('isflag',true);
return true;
}else{
self.attr('isflag',false);
return false;
}
}else{
var arr = val.split(',');
for(var i=0;i<arr.length;i++){
if(reg.getObjectType(arr[i])){
self.attr('isflag',true);
continue;
}else{
self.attr('isflag',false);
return false;
}
}
return true;
}
},errorMsg:"双精度浮点型数组,英文','分隔"},
len: function(str){
if(str.length>200){
return false;
}else{
return true;
}
},
getObjectType:function(obj){
var type = Object.prototype.toString.call(obj*1);
if(type.indexOf('Number')!==-1 && /^([1-9]\d*|0)(\.\d+)?$/.test(obj)){
return true;
}else{
return false;
}
}
};
var limit = function(str,min, max){
var len = str.length;
return len >= min && len <= max;
};
var Validate = (function(thisForm,success,error){
var oThis = _this;
var $form = thisForm;
var $aTags = $form.find('[allattr]');//需要验证的元素
var arr1 = [];
var flag=[];
var isFlag = true;
var result = null;
var resultFlag = [];
$aTags.each(function(){
$(this).attr('isflag',false);
});
$.each($aTags, function(index,item){ //遍历元素,并进行验证
var errorTitle = '';
var eachExp = '';//一本表单元素的所有规则 && 的状态 通过 true 否则false
var that = this;
var info = $(that).prev("span").html();
var $attrArr = $(that).attr('allattr').split(',');
$.each($attrArr,function(indexForAttr,name){
if($(that).attr('allattr').indexOf("isrequired")===-1 && $.trim($(that).val())===""){
//选填为空的时候,跳出判断
$(that).css({'border':''});
$(that).attr('isflag',true);
eachExp += true+'&&';
}else{
if(name.indexOf('limit')>=0){ //包含值范围的的判断
var limits = name.split('=')[1].split('-');
var val = $(that).val();
var min = limits[0]*1;
var max = limits[1]*1;
if(limit(val,min,max)!==true){
$(that).attr('isflag',false);
isFlag = false;
eachExp += false+'&&';
errorTitle += '长度范围在'+min+' - '+max+'之间,';
}else{
$(that).attr('isflag',true);
eachExp += true+'&&';
}
}else if(!reg[name]){
//alert('无对应的验证表达式,请添加对应的正则表达式');
//dialogPrompt('表达式书写错误');
errorTitle = '无对应的验证表达式,请添加对应的正则表达式';
isFlag = false;
eachExp += false+'&&';
}else if(Object.prototype.toString.call(reg[name]["expression"]).indexOf('RegExp')!==-1 && reg[name]["expression"].test($(that).val())!==true){
$(that).attr('isflag',false);
isFlag = false;
eachExp += false+'&&';
errorTitle += reg[name]["errorMsg"]+',';
}else if(Object.prototype.toString.call(reg[name]["expression"]).indexOf('Function')!==-1){
eachExp += reg[name]["expression"]($(that), eachExp) + '&&';
errorTitle += reg[name]["errorMsg"]+',';
}else{
$(that).attr('isflag',true);
eachExp += true+'&&';
}
};
});
$(that).on('blur',function(){
var thatForBlur = this;
eachExp = '';
errorTitle = '';
var $meArr = $(thatForBlur).attr('allattr').split(',');
$.each($meArr,function(itemForThe,name){
if($(thatForBlur).attr('allattr').indexOf("isrequired")===-1 && $.trim($(thatForBlur).val())===""){
//选填为空的时候,跳出判断
$(thatForBlur).css({'border':''});
$(thatForBlur).attr('isflag',true);
eachExp += true+'&&';
}else{
if(name.indexOf('limit')>=0){ //包含值范围的的判断
var limits = name.split('=')[1].split('-');
var val = $(thatForBlur).val();
var min = limits[0]*1;
var max = limits[1]*1;
if(limit(val,min,max)!==true){
$(thatForBlur).attr('isflag',false);
isFlag = false;
eachExp += false+'&&';
errorTitle += '长度范围在'+min+' - '+max+'之间,';
}else{
$(thatForBlur).attr('isflag',true);
eachExp += true+'&&';
}
}else if(!reg[name]){
//alert('无对应的验证表达式,请添加对应的正则表达式');
//dialogPrompt('表达式书写错误');
errorTitle = '无对应的验证表达式,请添加对应的正则表达式';
isFlag = false;
eachExp += false+'&&';
}else if(Object.prototype.toString.call(reg[name]["expression"]).indexOf('RegExp')!==-1 && reg[name]["expression"].test($(thatForBlur).val())!==true){
$(thatForBlur).attr('isflag',false);
isFlag = false;
eachExp += false+'&&';
errorTitle += reg[name]["errorMsg"]+',';
}else if(Object.prototype.toString.call(reg[name]["expression"]).indexOf('Function')!==-1){
eachExp += reg[name]["expression"]($(thatForBlur), eachExp) + '&&';
errorTitle += reg[name]["errorMsg"]+',';
}else{
$(thatForBlur).attr('isflag',true);
eachExp += true+'&&';
}
};
});
var eachExpr = new Function("return " + eachExp.substring(0,eachExp.length-2))();
if(eachExpr){
$(thatForBlur).css({'border':''});
$(thatForBlur).attr('data-original-title','');
$(thatForBlur).next('span.warningInfo').remove();
}else{
$(thatForBlur).css({'border':'1px solid #F3565D'});
$(thatForBlur).attr('data-original-title',errorTitle.substring(0,errorTitle.length-1));
$(thatForBlur).next('span.warningInfo').remove();
$(thatForBlur).after('<span class="warningInfo">'+errorTitle.substring(0,errorTitle.length-1)+'<span>');
}
return false;
});
var eachExps = new Function("return " + eachExp.substring(0,eachExp.length-2))();
if(eachExps){
$(that).css({'border':''});
$(that).attr('data-original-title','');
$(that).next('span.warningInfo').remove();
}else{
$(that).css({'border':'1px solid #F3565D'});
$(that).attr('data-original-title',errorTitle.substring(0,errorTitle.length-1));
$(that).next('span.warningInfo').remove();
$(that).after('<span class="warningInfo">'+errorTitle.substring(0,errorTitle.length-1)+'<span>');
}
if(!isFlag){
//return false;
}
});
$aTags.each(function(){
resultFlag.push($(this).attr('isflag'));
});
for(var i=0;i<resultFlag.length;i++){
if(resultFlag[i]===""){
resultFlag[i] = false;
}
};
resultFlag = new Function('return '+resultFlag.join('&&'))();
if(resultFlag || $aTags.length===0){
success && success();
success = null;
}else{
error && error();
error = null;
};
return this;
})(options.thisForm,options.success,options.error);
//radio、checkbox选项的操作 同时匹配与其对应属性data-filed值相等的id隐藏域
//单选按钮
$(document).on('click','input[type=radio][data-field]',function(){
if($(this).prop('checked')===true){
var hiddenId = '#'+$(this).attr('data-field');//隐藏域id
$(hiddenId).val($(this).val());
}
});
//复选按钮
$(document).on('click','input[type=checkbox][data-field]',function(){
var field = $(this).attr('data-field');
var hiddenId = '#'+field;//隐藏域id
var aChildren = $('input[type=checkbox][data-field='+field+']');
var arr = [];
$.each(aChildren,function(index,item){
if($(this).prop('checked')===true){
arr.push($(this).val());
}
});
$(hiddenId).val(arr.join(','));
});
}
});
})(window,undefined,jQuery);
转载请指明出处。谢谢。