基于JS实现表单的自动验证功能

注:本文代码是在Github上找到的源码,在此基础上进行了修改。

表单验证的功能是通过JS代码实现的,在作者的验证JS代码中有已经设定好的数据格式,使用的是正则表达式,如果你想要设置自己的数据格式,可以在js文件最后找到datatype进行修改。作者的后端代码使用的是php,我修改为JAVA,这不影响前端页面。

整个代码框架是JSP+Servlet,前端页面的表单审核通过后才可以提交,将数据传输到后端进行处理,比如存到数据库等。

我这里的表单是一个注册会议模块,其实登录或者注册道理都一样,但是样式上可能不太好看,之前有尝试使用Bootstap Validator但是因效果出不来,就放弃了,使用BV样式会更好看一些。

 

JSP页面


    
	 
* 用户名:
请输入真实姓名!
* 性别:
* 手机:
请输入11位手机号码!
* 座机:
请输入座机 以( 区号-号码) 的格式
* 邮箱:
请输入常用的邮箱
* 地址:
请输入现居住地址
* 工作单位:
请输入工作单位
* 职位:
请输入当前职位
* 职称:
请输入当前职称
* 研究领域:
请输入当前研究领域
* 邮编:
请输入邮编
* 是否住宿:
* 是否合住:
* 发票抬头:
请输入发票抬头
* 税号:
请输入税号!
* 汇款金额:
请输入汇款金额!
* 备注:
请输入备注!

 

 

Servlet后端

#这里只获取了一个name值示例
#注意不设置编码中文输入下会出现乱码

public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	request.setCharacterEncoding("UTF-8");
	String name = request.getParameter("name");
	System.out.println(name);
}

 

注意web xml文件里面配置servlet的路径,而表单提交的时候路径是不加“/”的


    Register
    servlet.Register



    Register
    /servlet/Register

 

JS Validation(关键代码)

/*
    通用表单验证方法
    Validform version 3.0
	For more information, you can visit www.rjboy.cn
	By sean during April 7, 2010 - July 30, 2011
	
	Demo:
	$(".demoform").Validform({//$(".demoform")指明是哪一表单需要验证,名称需加在form表单上;
		btnSubmit:"#btn_sub", //#btn_sub是该表单下要绑定点击提交表单事件的按钮;如果form内含有submit按钮该参数可省略;
		tiptype:1, //可选项 1=>pop box,2=>side tip,默认为1,也可以传入一个function函数,自定义提示信息的显示方式(可以实现你想要的任何效果,具体参见demo页);
		tipSweep:true,//可选项 true | false ,为true时提示信息将只会在表单提交时触发显示,各表单元素blur时不会被触发显示;
		postonce:true, //可选项 是否开启网速慢时的二次提交防御,true开启,不填则默认关闭;
		ajaxPost:true, //使用ajax方式提交表单数据,默认false,提交地址就是action指定地址;
		datatype:{//传入自定义datatype类型;
			"*6-20": /^[^\s]{6,20}$/,
			"z2-4" : /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,4}$/
		},
		callback:function(data){
			//返回数据data是json格式,{"info":"demo info","status":"y"}
			//info: 输出提示信息;
			//status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作;
			//你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作;
			
			//这里执行回调操作;
			//注意:如果不是ajax方式提交表单,传入callback表单将不会提交。在验证全部通过后会执行这个回调函数,这种情况data参数不可用。
		}
	});
*/

(function($){
	var errorobj=null,//指示当前验证失败的表单元素;
		msgobj,//pop box object 
		msghidden=true, //msgbox hidden?
		tipmsg={//默认提示文字;
			w:"请输入正确信息!",
			r:"通过信息验证!",
			c:"正在检测信息…",
			s:"请填入信息!",
			v:"所填信息没有经过验证,请稍后…",
			p:"正在提交数据…",
			err:"提交数据出错,请检查地址是否正确!"
		},
		creatMsgbox=function(){
			if($("#Validform_msg").length!==0){return false;}
			msgobj=$('
提示信息χ
').appendTo("body");//提示信息框; msgobj.find("a.Validform_close").click(function(){ msgobj.hide(); msghidden=true; if(errorobj){ errorobj.focus().addClass("Validform_error"); } return false; }).focus(function(){this.blur();}); $(window).bind("scroll resize",function(){ if(!msghidden){ var left=($(window).width()-msgobj.width())/2, top=($(window).height()-msgobj.height())/2, topTo=(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+(top>0?top:0); msgobj.animate({ left : left, top : topTo },{ duration:400 , queue:false }); } }); }; $.fn.Validform=function(settings){ var defaults={}; settings=$.extend({},$.fn.Validform.sn.defaults,settings); settings.datatype && $.extend($.Datatype,settings.datatype); this.each(function(){ var $this=$(this); var posting=false; //防止表单按钮双击提交两次; $this.find("[tip]").each(function(){//tip是表单元素的默认提示信息,这是点击清空效果; var defaultvalue=$(this).attr("tip"); var altercss=$(this).attr("altercss"); $(this).focus(function(){ if($(this).val()==defaultvalue){ $(this).val(''); if(altercss){$(this).removeClass(altercss);} } }).blur(function(){ if($.trim($(this).val())===''){ $(this).val(defaultvalue); if(altercss){$(this).addClass(altercss);} } }); }); //绑定blur事件; $this.find("[datatype]").blur(function(){ var flag=true; flag=$.fn.Validform.sn.checkform($(this),$this,{type:settings.tiptype,sweep:settings.tipSweep},"hide"); if(!flag){return false;} if(typeof(flag)!="boolean"){//如果是radio, checkbox, select则不需再执行下面的代码; $(this).removeClass("Validform_error"); return false; } flag=$.fn.Validform.sn.regcheck($(this).attr("datatype"),$(this).val()); if(!flag){ if($(this).attr("ignore")==="ignore" && ( $(this).val()==="" || $(this).val()===$(this).attr("tip") )){ if(settings.tiptype==2){ $(this).parent().next().find(".Validform_checktip").removeClass().addClass("Validform_checktip").text(""); }else if(typeof settings.tiptype == "function"){ (settings.tiptype)("",{obj:$(this),type:4},$.fn.Validform.sn.cssctl); } flag=true; errorobj=null; return true; } errorobj=$(this); $.fn.Validform.sn.showmsg($(this).attr("errormsg")||tipmsg.w,settings.tiptype,{obj:$(this),sweep:settings.tipSweep},"hide"); //当tiptype=1的情况下,传入"hide"则让提示框不弹出,tiptype=2的情况下附加参数"hide"不起作用; }else{ if($(this).attr("ajaxurl")){ var inputobj=$(this); inputobj.attr("valid",tipmsg.c); $.fn.Validform.sn.showmsg(tipmsg.c,settings.tiptype,{obj:inputobj,type:1,sweep:settings.tipSweep},"hide"); $.ajax({ type: "POST", url: inputobj.attr("ajaxurl"), data: "param="+$(this).val()+"&name="+$(this).attr("name"), dataType: "text", success: function(s){ if(s=="y"){ inputobj.attr("valid","true"); errorobj=null; $.fn.Validform.sn.showmsg(tipmsg.r,settings.tiptype,{obj:inputobj,type:2,sweep:settings.tipSweep},"hide"); }else{ inputobj.attr("valid",s); errorobj=inputobj; $.fn.Validform.sn.showmsg(s,settings.tiptype,{obj:inputobj,sweep:settings.tipSweep}); } }, error: function(){ inputobj.attr("valid",tipmsg.err); errorobj=inputobj; $.fn.Validform.sn.showmsg(tipmsg.err,settings.tiptype,{obj:inputobj,sweep:settings.tipSweep}); } }); }else{ errorobj=null; $.fn.Validform.sn.showmsg(tipmsg.r,settings.tiptype,{obj:$(this),type:2,sweep:settings.tipSweep},"hide"); } } }); $this.find(":checkbox[datatype],:radio[datatype]").each(function(){ var _this=$(this); var name=_this.attr("name"); $this.find("[name="+name+"]").filter(":checkbox,:radio").not("[datatype]").bind("blur",function(){ _this.trigger("blur"); }); }); //subform var subform=function(){ var flag=true; if(posting){return false;} $this.find("[datatype]").each(function(){ flag=$.fn.Validform.sn.checkform($(this),$this,{type:settings.tiptype,sweep:settings.tipSweep}); if(!flag){ errorobj.focus(); return false; } if(typeof(flag)!="boolean"){ flag=true; return true; } flag=$.fn.Validform.sn.regcheck($(this).attr("datatype"),$(this).val()); if(!flag){ if($(this).attr("ignore")==="ignore" && ( $(this).val()==="" || $(this).val()===$(this).attr("tip") )){ flag=true; errorobj=null; return true; } errorobj=$(this); errorobj.focus(); $.fn.Validform.sn.showmsg($(this).attr("errormsg")||tipmsg.w,settings.tiptype,{obj:$(this),sweep:settings.tipSweep}); return false; } if($(this).attr("ajaxurl")){ if($(this).attr("valid")!="true"){ flag=false; var thisobj=$(this); errorobj=thisobj; errorobj.focus(); $.fn.Validform.sn.showmsg(thisobj.attr("valid") || tipmsg.v,settings.tiptype,{obj:thisobj,sweep:settings.tipSweep}); if(!msghidden || settings.tiptype!=1){ setTimeout(function(){ thisobj.trigger("blur"); },2000); } return false; }else{ $.fn.Validform.sn.showmsg(tipmsg.r,settings.tiptype,{obj:$(this),type:2,sweep:settings.tipSweep},"hide"); flag=true; } } }); if(flag && !posting){ errorobj=null; if(settings.postonce){posting=true;} if(settings.ajaxPost){ $.fn.Validform.sn.showmsg(tipmsg.p,settings.tiptype,{type:1,sweep:settings.tipSweep},"alwaysshow");//传入"alwaysshow"则让提示框不管当前tiptye为1还是2都弹出; $.ajax({ type: "POST", dataType:"json", url: $this.attr("action"), data: $this.serialize(), success: function(data){ $.fn.Validform.sn.showmsg(data.info,settings.tiptype,{type:2,sweep:settings.tipSweep},"alwaysshow"); settings.callback && (settings.callback)(data); }, error: function(){ $.fn.Validform.sn.showmsg(tipmsg.err,settings.tiptype,{type:3,sweep:settings.tipSweep},"alwaysshow"); } }); return false; }else{ settings.callback ? (settings.callback)() : $this.get(0).submit(); } } }; settings.btnSubmit && $this.find(settings.btnSubmit).bind("click",subform); $this.submit(function(){ subform(); return false; }); }); //预创建pop box; if( settings.tiptype==1 || (settings.tiptype==2 && settings.ajaxPost) ){ creatMsgbox(); } }; $.fn.Validform.sn={ defaults:{ tiptype:1, tipSweep:false, postonce:false, ajaxPost:false }, toString:Object.prototype.toString, regcheck:function(type,gets){ if(!(type in $.Datatype)){ var mac=type.match($.Datatype["match"]), temp; reg:for(var name in $.Datatype){ temp=name.match($.Datatype["match"]); if(!temp){continue reg;} if(mac[1]===temp[1]){ var str=$.Datatype[name].toString(); var regxp=new RegExp("\\{"+temp[2]+","+temp[3]+"\\}"); str=str.replace(regxp,"{"+mac[2]+","+mac[3]+"}").replace(/^\//,"").replace(/\/$/,""); $.Datatype[type]=new RegExp(str); break reg; } } } if(this.toString.call($.Datatype[type])=="[object RegExp]"){ return $.Datatype[type].test(gets); } return false; }, showmsg:function(msg,type,o,show){//o:{obj:当前对象, type:1=>正在检测 | 2=>通过}, show用来判断tiptype=1的情况下是否弹出信息框; if(errorobj){errorobj.addClass("Validform_error");} if(typeof type == "function"){ if(!(o.sweep && show=="hide")){ (type)(msg,o,this.cssctl); } return false; } if(type==1 || show=="alwaysshow"){ msgobj.find(".Validform_info").text(msg); } if(type==1 && show!="hide" || show=="alwaysshow"){ msghidden=false; msgobj.find(".iframe").css("height",msgobj.height()); var left=($(window).width()-msgobj.width())/2; var top=($(window).height()-msgobj.height())/2; top=(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+(top>0?top:0); msgobj.css({ "left":left }).show().animate({ top:top },100); } if(type==2){ o.obj.parent().next().find(".Validform_checktip").text(msg); this.cssctl(o.obj.parent().next().find(".Validform_checktip"),o.type); } }, checkform:function(obj,parentobj,tiptype,show){//show用来判断是表达提交还是blur事件引发的检测; var errormsg=obj.attr("errormsg") || tipmsg.w, inputname; if(obj.is("[datatype='radio']")){ //判断radio表单元素; inputname=obj.attr("name"); var radiovalue=parentobj.find(":radio[name="+inputname+"]:checked").val(); if(!radiovalue){ errorobj=obj; this.showmsg(errormsg,tiptype.type,{obj:obj,sweep:tiptype.sweep},show); return false; } errorobj=null; this.showmsg(tipmsg.r,tiptype.type,{obj:obj,type:2,sweep:tiptype.sweep},"hide"); return "radio"; } if(obj.is("[datatype='checkbox']")){ //判断checkbox表单元素; inputname=obj.attr("name"); var checkboxvalue=parentobj.find(":checkbox[name="+inputname+"]:checked").val(); if(!checkboxvalue){ errorobj=obj; this.showmsg(errormsg,tiptype.type,{obj:obj,sweep:tiptype.sweep},show); return false; } errorobj=null; this.showmsg(tipmsg.r,tiptype.type,{obj:obj,type:2,sweep:tiptype.sweep},"hide"); return "checkbox"; } if(obj.is("[datatype='select']")){ //判断select表单元素; if(!obj.val()){ errorobj=obj; this.showmsg(errormsg,tiptype.type,{obj:obj,sweep:tiptype.sweep},show); return false; } errorobj=null; this.showmsg(tipmsg.r,tiptype.type,{obj:obj,type:2,sweep:tiptype.sweep},"hide"); return "select"; } var defaultvalue=obj.attr("tip"); if((obj.val()==="" || obj.val()===defaultvalue) && obj.attr("ignore")!="ignore"){ errorobj=obj; this.showmsg(obj.attr("nullmsg") || tipmsg.s,tiptype.type,{obj:obj,sweep:tiptype.sweep},show); return false; } if(obj.attr("recheck")){ var theother=parentobj.find("input[name="+obj.attr("recheck")+"]:first"); if(obj.val()!=theother.val()){ errorobj=obj; this.showmsg(errormsg,tiptype.type,{obj:obj,sweep:tiptype.sweep},show); return false; } } obj.removeClass("Validform_error"); errorobj=null; return true; }, cssctl:function(obj,status){ switch(status){ case 1: obj.removeClass("Validform_right Validform_wrong").addClass("Validform_checktip Validform_loading");//checking; break; case 2: obj.removeClass("Validform_wrong Validform_loading").addClass("Validform_checktip Validform_right");//passed; break; case 4: obj.removeClass("Validform_right Validform_wrong Validform_loading").addClass("Validform_checktip");//for ignore; break; default: obj.removeClass("Validform_right Validform_loading").addClass("Validform_checktip Validform_wrong");//wrong; } } }; //公用方法显示&关闭信息提示框; $.Showmsg=function(msg){ creatMsgbox(); $.fn.Validform.sn.showmsg(msg,1); }; $.Hidemsg=function(){ msgobj.hide(); msghidden=true; }; $.Datatype={ "match":/^(.+)(\d+)-(\d+)$/, "*":/^[^\s]+$/, "*6-16":/^[^\s]{6,16}$/, "n":/^\d+$/, "s":/^[\u4E00-\u9FA5\uf900-\ufa2d\w]+$/, "s6-18":/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{6,18}$/, "p":/^[0-9]{6}$/, "m":/^13[0-9]{9}$|15[0-9]{9}$|18[0-9]{9}$/, "e":/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, "s11": /^[0-9]{11}$/, "line":/^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})$/, "postcode":/^([0-9]{6})$/ }; })(jQuery);

 

效果图:

基于JS实现表单的自动验证功能_第1张图片

你可能感兴趣的:(web)