一套表单验证的解决


(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);



转载请指明出处。谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值