`

自定义表单验证框架

阅读更多

自定义表单验证框架

/**
*  
*/
var Tool = {};
Tool.onReady=function(handler){
	window.onload=handler;
}
Tool.createSpan=function(style,msg){
	return "<span class="+style+">"+msg+"</span>"
}
Tool.getEl=function(id){
	return document.getElementById(id);
}
//为消息提供样式选择
Cls=function(){
	this.input="inputsgl";
	this.radio="";
	this.check="";
	this.textarea="";
	this.select="";
	this.defaultCls="onshow";
	this.blurCls="";
	this.focusCls="onfocus";
	this.errorCls="onerror";
	this.rightCls="oncorrect";
	this.setClass=function(o,className){
		o.className=this[className]
	}
}
//此类定义了一些正则表达式
Reg=function(){
	this.user=/^\w{6,12}$/;//用户名 一般是 6-12位
	this.email=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;//电子邮件
	this.phone=/^\d{3}-\d{8}|\d{4}-\d{7}$/;//国内电话号码
	//this.html=/^<(\S*?)[^>]*>.*?</\1>|<.*? />$/;
	this.blank=/^$/;
	this.postcode=/^[1-9]\d{5}(?!\d)$/;//邮编
	this.card=/^\d{15}|\d{18}$/;//身份证号码
	this.tinteger=/^[1-9]\d*$/;//正整数
	this.tinteger=/^-[1-9]\d*$/;//负整数
}
//表单组件验证类
Fv=function(c){
	this.config=c;
	this.form; //设置当前注册的表单
	this.cls= new Cls;//初使化消息样式
	this.regexp=new Reg;//初使化正则表达式
	
	
	//注册当前form表单对象
	this.register=function(){
		this.form=document.forms[c.form];
		this.form.onsubmit=this.submit(c);//设置当前表单的提交监听函数
		this.reg(this.config.fields);
	}
	
	setMsg=function(o,c,m){//设置消息方法,局部方法,当一个内部类来用
		o.className=c;
		o.innerText=m;
	}
	
	this.reg=function(cf){//注册表单,主要是将配置信息注册到表单中
		if(cf.length<1) return;
		var o,k;
		for(var i=0;i<cf.length;i++){
			k=cf[i];
			o=this.form[k.name];
			//添加默认表单组件信息 
			k.defaultMsg?this.addMsg(this.cls.defaultCls,k.defaultMsg,k.msgTip):"";
			//添加得到焦点时的信息
			k.focusMsg?this.addFocusListener(o,{cls:this.cls.focusCls,msg:k.focusMsg,tip:k.msgTip}):"";
			//为组件添加失去焦点监听函数
			this.addBlurListener(o,k);
		}	
	}
	//添加得到焦点事件 o 表单对象,m消息对象
	this.addFocusListener=function(o,m){
		var arr=(!o.length || o.nodeName=='SELECT')?[o]:o;
		for(var i=0;i<arr.length;i++){
			arr[i].onfocus=this.addEvMsg(m.cls,m.msg,m.tip);
		}
	}
	//添加表单组件失去焦点
	this.addBlurListener=function(o,k){
		//var arr=o.length?o:[o];
		var arr=(!o.length || o.nodeName=='SELECT')?[o]:o;
		var t=this.getType(o);
		for(var i=0;i<arr.length;i++){
			arr[i].onblur=(this[t+"OnBlur"])(o,k);
		}
	}

	//文本框推动焦点时触发的事件
	this.textOnBlur=function(o,k){
		var cl=this.cls.defaultCls;
		var el=this.cls.errorCls;
		var rl=this.cls.rightCls;
		var t=Tool.getEl(k.msgTip);
		var r=(typeof(k.regExp)=="string")?this.regexp[k.regExp]:k.regExp;
		return function(){
			var clazz,msg;
			if(o.value==""){
				clazz=cl;
				msg=k.defaultMsg;
			}else{
				if(r && !r.test(o.value)){
					clazz=el;
					msg=k.errorMsg;
				}else{
					clazz=rl;
					msg=k.rightMsg;
				}
			}
			setMsg(t,clazz,msg);
		}
	}
	//多选框失去焦点时触发的事件
	this.checkOnBlur=function(o,k){
		var dc=this.cls.defaultCls;
		var rc=this.cls.rightCls;
		return function(){
			var cls=dc,msg=k.defaultMsg;
			var tip=Tool.getEl(k.msgTip);
			var c=0;
			for(var j=0;j<o.length;j++){
				if(o[j].checked){
					c++;
					if(c>=k.number){
						cls=rc;
						msg=k.rightMsg;
						break;
					}
				}
			}
			setMsg(tip,cls,msg);
		}
	
	}
	//单选框失去焦点时触发的事件
	this.radioOnBlur=function(o,k){
		var dc=this.cls.defualtCls;
		var rc=this.cls.rightCls;
		return function(){
			var cls=dc,msg=k.defaultMsg;
			var tip=Tool.getEl(k.msgTip);
			for(var j=0;j<o.length;j++){
				if(o[j].checked){
					cls=rc;
					msg=k.rightMsg;
					break;
				}
			}
			setMsg(tip,cls,msg);
		}
	
	}
	
		//下拉列表失去焦点时触发的事件
	this.selectOnBlur=function(o,k){
		var dc=this.cls.defaultCls;
		var rc=this.cls.rightCls;
		return function(){
			var cls=dc,msg=k.defaultMsg;
			var tip=Tool.getEl(k.msgTip);
			if(o.selectedIndex>0){
				cls=rc;
				msg=k.rightMsg;
			}
			setMsg(tip,cls,msg?msg:'');
		}
	
	}
	
	
	this.submit=function(){//由于事件监听函数不能有参数,所以这里用一个闭包
		var f=this.form;//f为this.form 的一个引用,当在闭包函数中的时候,this 指向的是window,而不是当前的那个对象了
		var re=this.regexp;
		var style=this.cls;
		var config=this.config;
		return function(){
			var result=true;
			var c,r,o,cla,msg,tip;
			var vf=config.fields;
			for(var i=0;i<vf.length;i++){//循环验证表单是否验证通过
				c=vf[i];
				o=f[c.name];
				tip=Tool.getEl(c.msgTip);
				var r=(typeof(c.regExp)=="string")?re[c.regExp]:c.regExp;
				if(isPassed(o,c,r)){
					cla=style.errorCls;
					msg=c.errorMsg;
					result=false;
					setMsg(tip,cla,msg);
				}
			}
			var r=config['submit']?(config['submit'])():true;
			return result && r;
		}
	}
	
	isPassed=function(o,c,r){//是否通过验证
		var type=o.type || (o.length && o[0].type);
		switch(type){
			case 'text' :
			case 'password'://判断文本控件,这样的控件是可以有正则表达式的
				return (!c.allownull &&  !r.test(o.value)) || (c.allownull && o.value!='' && !r.test(o.value));
			case 'radio':
				return !(c.allownull || isChecked(o,1));
			case 'checkbox':
				return !(c.allownull || isChecked(o,c.number));
			case 'select-one':
				return  !(c.allownull || o.selectedIndex>1);
			default:
				return true;
		}
		return false;
	}
	//判断选中个数是
	isChecked=function(o,n){
		var c=0;
		for(var i=0;i<o.length;i++){
			if(o[i].checked) c++;
		}
		return c>=n;
	}
	
	//判断下拉列表是否被选择了
	isSelected=function(o,n){
		var c=0;
		for(var i=0;i<o.length;i++){
			if(o[i].checked) c++;
		}
		return c>=n;
	}
	//失去焦点时显示的信息
	this.onblurMsg=function(o,c){
		var cl=this.cls.defaultCls;
		var el=this.cls.errorCls;
		var rl=this.cls.rightCls;
		var t=Tool.getEl(c.msgTip);
		var r=(typeof(c.regExp)=="string")?this.regexp[c.regExp]:c.regExp;
		return function(){
			var clazz,msg;
			if(o.value==""){
				clazz=cl;
				msg=c.defaultMsg;
			}else{
				if(r && !r.test(o.value)){
					clazz=el;
					msg=c.errorMsg;
				}else{
					clazz=rl;
					msg=c.rightMsg;
				}
			}
			setMsg(t,clazz,msg);
		}
	}
	
	this.addMsg=function(c,m,i){
		var o = Tool.getEl(i);
		o.className=c;
			o.innerText=m;
	}
	this.addEvMsg=function(c,m,i){
		return function(){
			var s = Tool.getEl(i);
			s.className=c;
			s.innerText=m;
		}
	}
	
	
	this.getType=function(o){
		var type=o.type || (o.length && o[0].type);
		switch(type){
			case 'text' :
			case 'password':
				return "text";
			case 'radio':
				return "radio";
			case 'checkbox':
				return "check";
			case 'select-one':
				return "select";
			default:
				return '';
		}
	}
	
	this.getEl=function(name){
		return this.form[name];
	}
	
	this.addClass=function(f){
		var cn=this.getType(f);
		this.cls.setClass(f,cn);
	}

}

 

 

调用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  <link rel="stylesheet" href="css/validator.css" type="text/css"></link>
   <link rel="stylesheet" href="css/style.css" type="text/css"></link>
  <script type="text/javascript" src="Fv.js"></script></head>
  <script type="text/javascript">
  
  	//var config=[{id:'username',isnull:true}];
  	function handler(){
  		alert("调用了自己的提交");
  		alert("就算验证通过我也不让表单提交,我返回一个false");
  		return false;
  	}
  	
  	var config={form:"myform",submit:handler,
  		fields:[{name:'username',allownull:false,regExp:'user',defaultMsg:'用户名不能为空,6-12位,如:zhangsan',focusMsg:'请输入你的用户名',errorMsg:'用户名不能为空,且不能有非法字符',rightMsg:'用户名输入合法',msgTip:'usertip'},
  				{name:'pwd',allownull:false ,regExp:'user',defaultMsg:'密码不能为空,6-12位,如:******',focusMsg:'请输入你的密码',errorMsg:'密码不能为空,且不能有非法字符',rightMsg:'用户密码输入合法',msgTip:'pwdtip'},
  				{name:'email',allownull:true,regExp:/^\w{3,12}@\w{1,10}.\w{2,10}$/,defaultMsg:'电子邮箱如:kefu@sina.com',focusMsg:'请输入你的电子邮箱',errorMsg:'非法的电子邮箱帐号',rightMsg:'电子邮箱输入正确',msgTip:'emailtip'},
  				{name:'sex',allownull:false,defaultMsg:'请选择用户性别',focusMsg:'没有第三种性别可选了',errorMsg:'用户性别必须选择',rightMsg:'你确认这个性别的吗?',msgTip:'sextip'},
  				{name:'likes',allownull:false,number:2,defaultMsg:'请选择用户爱好',focusMsg:'认真选择你的爱好吧',errorMsg:'用户爱好必须选择两项',rightMsg:'这些都是不错的爱好!',msgTip:'likestip'},
  				{name:'age',allownull:false,defaultMsg:'请选择您的年龄',focusMsg:'年龄必须要选择',errorMsg:'你还没有选择你的年龄!',rightMsg:'年龄选择正确!',msgTip:'agetip'}
  				]}
  	Tool.onReady(function(){
  		var f = new Fv(config);
  		f.register();
  	});
  	
  
  </script>
  <body>
  	<form action="" id="myform" id="myform" method="POST"> 
  	<center>
  	<table>
  		<tr><td>用&nbsp;&nbsp;户&nbsp;&nbsp;名:</td><td><input type="text" name="username" width=80/></td><td><span id="usertip"></span></td></tr>
  		<tr><td>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码:</td><td><input type="text" name="pwd" width=80/></td><td><span id="pwdtip"></span></td></tr>
  		<tr><td>电子邮箱:</td><td><input type="text" name="email"  width=80/></td><td><span id="emailtip"></span></td></tr>
  		<tr><td>性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别:</td><td><input type="radio" name="sex" value="男" >男&nbsp;&nbsp;&nbsp;<input type="radio" name="sex" value="女" >女</td><td><span id="sextip"></span></td></tr>
  		<tr><td>爱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好:</td><td><input type="checkbox" name="likes" value="体育" >体育&nbsp;&nbsp;&nbsp;<input type="checkbox" name="likes" value="蓝球" >蓝球</td><td><span id="likestip"></span></td></tr>
  		<tr><td>年&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;龄:</td><td><select name="age"><option>请选择</option><option>18</option><option>20</option><option>19</option></select></td><td><span id="agetip"></span></td></tr>
  		
  		<tr><td colspan=3 align="center"><input type="submit" value="提交表单"></td></tr>
  		</table>  
  		</center>
  	</form>
  </body>
</html>

 

分享到:
评论

相关推荐

    强大的表单验证框架

    "强大的表单验证框架"标题所指的,很可能是用于简化这一过程的高效工具,旨在帮助开发者更方便、更有效地进行表单数据验证。 表单验证框架通常包含以下核心功能: 1. **规则定义**:提供丰富的验证规则,如非空、...

    activiti自定义表单demo.rar

    在本项目"activiti自定义表单demo"中,我们主要关注的是如何使用SpringBoot集成Activiti工作流引擎,实现自定义表单和流程。这个Demo提供了完整的代码示例,帮助开发者理解并应用到实际项目中。以下是相关知识点的...

    基于layui自定义表单组件

    【基于layui自定义表单组件】是针对C#开发者设计的一种高效前端开发工具,它结合了layui框架的优势,为创建动态、交互性强的Web表单提供了便利。layui是一款优秀的前端轻量级框架,以其简洁的代码结构、丰富的模块...

    formvalidator 表单验证框架

    formvalidator 是一个强大的前端表单验证框架,专为开发者提供高效、灵活的表单数据验证解决方案。这个框架允许开发者在用户提交表单前检查输入的数据,确保数据的完整性和准确性,从而提高用户体验并减少服务器端的...

    自定义表单Winform

    7. **错误处理和验证**:自定义表单可能包含自定义的验证规则,确保用户输入的有效性。可以使用控件的Validating和Validated事件来实现这一点,或者创建自定义验证器类。 8. **国际化和本地化**:如果应用程序需要...

    表单验证框架

    "表单验证框架"就是一种专门用于简化这一过程的工具,它提供了便捷的方式来验证用户在网页表单中填写的信息。 首先,我们要理解表单验证的重要性。在网页应用中,用户输入的数据经常需要被处理或存储,例如注册账号...

    JAVA动态表单设计,自定义表单,自定义数据

    总的来说,"JAVA动态表单设计,自定义表单,自定义数据"涉及的技术栈包括Java后端开发、前端界面设计、数据库管理和RESTful API设计。通过以上各模块的协同工作,可以构建出一个高效、易用的动态表单系统,满足不同...

    自定义表单的实现源代码

    三、表单验证 在自定义表单中,验证是确保用户输入符合预设规则的关键步骤。这可以通过前端验证(JavaScript)或后端验证(服务器端语言如PHP、Java、Python等)来实现。前端验证可提高用户体验,但后端验证同样必不...

    自定义表单设计器演示程序

    自定义表单设计器是一种强大的工具,它允许用户根据自己的需求创建和定制各种表单,而无需深入编程。在“自定义表单设计器演示程序”中,我们能够探索这种技术的实际应用,通过提供的两个示例模板,可以更好地理解其...

    自定义表单设计器演示版源码(C#).rar.rar

    2. 自定义控件:除了.NET Framework提供的标准控件,自定义表单设计器可能还包括一些特定的自定义控件,这些控件可能具有特殊的功能或者外观,如数据绑定、验证规则等。 3. 设计时支持:为了在设计器中正确显示和...

    java表单验证框架

    Java表单验证框架是开发Web应用时不可或缺的一部分,它能够帮助开发者轻松地对用户输入的数据进行有效性检查,确保数据的准确性和安全性。本框架以简洁、高效为特点,通过在表单字段上添加正则表达式标签,即可实现...

    JS客户端表单验证框架

    在使用**JS客户端表单验证框架**时,开发者不再需要手动编写复杂的JavaScript函数来处理每个验证规则。框架内包含了一套完善的规则定义系统,允许开发者根据业务需求设置各种验证条件,如必填、邮箱格式、电话号码、...

    jquery表单验证框架:jquery.validate.zip

    《jQuery表单验证框架——深入理解jQuery.validate》 在网页开发中,表单验证是必不可少的一环,它能确保用户输入的数据符合预期,减少服务器端的处理负担,提高用户体验。jQuery是一个广泛使用的JavaScript库,而...

    自定义 validate验证 struts1框架

    3. **配置struts-config.xml**:在项目的`struts-config.xml`配置文件中,你需要将自定义的ActionForm与相应的Action进行关联,并指定表单验证使用的ActionForm类。同时,可以在这里配置全局错误消息,以及默认的...

    sui表单验证框架

    sui表单验证框架是一款强大的JavaScript开发工具,专用于实现高效、灵活的表单验证功能。在Web应用中,表单验证是不可或缺的一部分,它确保用户输入的数据符合预设的规则,从而提高数据质量和用户体验。sui框架凭借...

    PHP自定义表单生成

    2. 表单验证:在客户端,可以通过JavaScript进行基本的表单验证,如非空检查、格式校验等。在服务器端,PHP可以接收并处理表单数据,进行更严格的验证,确保数据的安全性和完整性。 二、自定义表单生成 1. 动态...

    自定义验证框架

    自定义验证框架是Struts的一个强大功能,允许开发者根据特定的业务需求定制验证逻辑。以下将详细介绍如何在Struts中实现自定义验证框架,以及其关键组件和工作流程。 1. **配置验证规则**: 在Struts中,验证规则...

Global site tag (gtag.js) - Google Analytics