`
thecloud
  • 浏览: 893558 次
文章分类
社区版块
存档分类
最新评论

打造可复用可扩展javascript验证表单脚本

 
阅读更多

如果需要从用户那里收集信息,就需要使用表单。

表单包含大多数常见的图形界面元素,例如文本框,单选按钮,复选框,下拉菜单等等。

填写完表单,点击Submit按钮将表单发送给web服务器,尽管可以通过服务器CGI程序完成验证,但在客户端用javascript验证要快得多,而且用户操作的效率也高。


这篇博客,主要是把我写的一个用于验证表单的可复用,可扩展的javascript脚本(版本1.0)分享给大家.

先来看看实现效果:

1、初始表单


2、提交,

如果Email为空,则:


3、如果Email不符合规范,则:


4、如果没有选择下拉框内容,则:


5、如果没有选择单选按钮中的一个,则:


6、根据已选字段,自动选择其他字段:选择NormalUser会自动选择2G

验证两个至少选一个:如果没有输入地址,也没有选择地址,则:


7、验证邮编:如果输入错误的邮编则:


8、验证文件:如果输入错误的Image格式,则:


javascript脚本(ValidForm1.js):

// JavaScript Document

window.onload=initForms;

function initForms(){
	for (var i=0;i<document.forms.length;i++){
		//遍历所有表单,执行验证
		document.forms[i].onsubmit=function(){return validForm();}
	};
	//为复选框NormalUser注册事件
	document.getElementById("NormalUser").onclick=spaceSet;
};


function validForm(){
	var allGood=true;
	//获得所有标签
	var allTags=document.getElementsByTagName("*");
	
	for (var i=0;i<allTags.length;i++){
		//检验所有标签
		if(!validTag(allTags[i])){
			allGood=false;
			};
		};
	    return allGood;
	    
		//检验标签是否有效
	    function validTag(thisTag){
			var outClass="";
			//获得该标签的class属性
			var allClasses=thisTag.className.split(" ");
			for (var j=0;j<allClasses.length;j++){
				//验证该标签,通过改变class标识无效标签
				outClass += validBasedOnClass(allClasses[j])+" ";
			};
		
			thisTag.className=outClass;
			
			if(outClass.indexOf("invalid")>-1){
				//标识出无效的输入值前的标签
				invalidLabel(thisTag.parentNode);
				//无效输入标签获得焦点
				thisTag.focus();
				//如果是输入标签,则选中其中的文本
				if(thisTag.nodeName=="INPUT"){
					thisTag.select();
				};
				return false;
			};
				return true;
				
				
			//标识无效的字段,添加类名invalid
			function validBasedOnClass(thisClass){
				var classBack="";
				//验证,在这里可以扩展验证
				switch(thisClass){
					case "":
					case "invalid":
						break;
					case "reqd":
					    //判断空
						if (allGood && thisTag.value=="")
						//invalid后有空格
						{classBack="invalid ";};
						classBack += thisClass;
						break;
				    case "radio":
					    //检查是否已选单选框
						if(allGood && !radioPicked(thisTag.name)){classBack="invalid ";};
						classBack += thisClass;
						break;
					case "isNum":
						//检查是否是数字
						if(allGood && !isNum(thisTag.value)){classBack="invalid ";};
						classBack += thisClass;
						break;
					case "isEmail":
						//检查是否是Email
						if(allGood && !isEmail(thisTag.value)){classBack="invalid ";};
						classBack += thisClass;
						break;
					case "isImage":
						//检查是否是图片,可以演化为检查文件名
						if(allGood && !isImg(thisTag.value)){classBack="invalid ";};
						classBack += thisClass;
						break;
					case "isPostcode":
					    //检查邮政编码
					    if(allGood && !isPostcode(thisTag.value)){classBack="invalid ";};
						classBack += thisClass;
						break;
					case "isAddress":
						classBack += thisClass;
						break;
					default:
					   //invalid后有空格
					   //检查是否至少已经设置了两个字段之一
					   if(allGood && !crossCheck(thisTag,thisClass)){classBack="invalid ";};
						classBack += thisClass;
					};
					return classBack;
				
				};
			
			//检查是否至少已经设置了两个字段之一
			//这是为邮政编码字段和地址列表元素准备的
			function crossCheck(inTag,otherFieldID){
				if(!document.getElementById(otherFieldID)){return false;};
					return (inTag.value!="" || document.getElementById(otherFieldID).value!="")
				};
				
			//标识出有问题的字段的标签	
			function invalidLabel(parentTag){
				if(parentTag.nodeName=="LABEL"){
					//invalid前有空格
					parentTag.className += " invalid";
					};
				};
				
			//确保用户选择了一个单选按钮
			function radioPicked(radioName){
				var radioSet="";
				//循环遍历表单,如果找到要找单选按钮组,radio就会包含一个值
				for (var k=0;k<document.forms.length;k++){
					//将radioSet设置为正在查看的表单中单选按钮组的名称
					if(!radioSet){
						radioSet=document.forms[k][radioName];
						};
					};
				//如果不能找到单选按钮组,则返回false,不能选择单选按钮
				if(!radioSet){return false;}
				//检查每个单选按钮,如果有一个被选中,则返回true
				for(k=0;k<radioSet.length;k++){
					if(radioSet[k].checked){
						return true;
						};
					};
				//没有发现被选中单选按钮,则返回false
			    return false;
				};
			//验证是否是数字	
			function isNum(passedVal){
				//如果字段是空的,那么肯定不是数组,直接返回False就可以了
				if (passedVal==""){return false;}
				for(var k=0; k<passedVal.length;k++)
				{   
				     //charAt函数返回字段位置K上的字符,检查是否为数字
					if(passedVal.charAt(k)<"0"){return false;}
					if (passedVal.charAt(k)>"9"){return false;}
					};
				  	return true
				};

		    //纯javascript检查邮箱(不使用正则表达式),只是检验输入的内容符合Email的正确形式,无法确认是否存在。
			function validEmail(email){
				//验证是否存在空格,斜杠,冒号,都好分号等无效字符
				var invalidChars=" /:,;";
				if (email==""){return false;};
				for (var k=0;k<invalidChars.length;k++){
					var badChar=invalidChars.charAt(k);
					if(email.indexOf(badChar)>-1){return false;};
					};
				//验证是否存在@
				var atPos=email.indexOf("@",1);
				if(atPos==-1){return false;};
				//验证@是否重复存在
				if(email.indexOf("@",atPos+1)!=-1){return false;};
				//验证是否存在点
				var periodPos=email.indexOf(".",atPos);
				if(periodPos==-1){return false;};
				//验证点号后是否至少有两个字符
				if(periodPos+3>email.length){return false;};
				return true;
				};
			//用正则表达式检验电子邮件地址(推荐使用)
			function isEmail(email){
				var reEmail=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
				return reEmail.test(email);
				};
			//用正则表达式检验文件后缀是否为gif或jpg
			function isImg(newURL){
				var reImg=/^(file|http):\/\/\S+\/\S+\.(gif|jpg)$/i;
				return reImg.test(newURL);
				};
				
		    //验证邮政编码
			function isPostcode(postcode){
				var rePostcode=/^[0-9]{6}$/;
				return rePostcode.test(postcode);
				}
				
				
			//可以在这里继续扩展验证内容,例如
			//验证座机号码
			//验证手机
		};
		
	};
//根据用户做出的选择自动设置字段输入
function spaceSet(){
	if(this.checked){
		document.getElementById("Space2").checked=true;
			}else
			{
		document.getElementById("Space2").checked=false;	
				};
	};

注释,我尽量写得详细些,大家应该能看明白。

可复用:

基本上囊括了表单上最常用的几个控件的验证方法.

可扩展,方法:

只要在这个位置

加入你需要验证的标签的class属性,

然后在这里,


添加你的验证方法即可.


Html文档:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
    <script type="text/javascript" src="ValidForm1.js"></script>
    <link rel="stylesheet" type="text/css" href="ValidForm.css">
</head>

<body>
<h2 >Valid Form</h2>
<form action="#">
	<p><label for="emailAddr">Email Address:
    	<input id="emailAddr" type="text" size="30" class="reqd isEmail" />
        </label></p>
        
    <p><label for="color">Colors:
    	<select id="color" class="reqd">
        <option value="" selected="selected">Choose a color</option>
        <option value="Red">Red</option>
         <option value="Green">Green</option>
          <option value="Blue">Blue</option>
          </select>
         </label></p>
    <p>Options:
    	<label for="NormalUser"><input type="checkbox" id="NormalUser" value="Yes" />NormalUser(2G only)</label>
         <label for="AdvancedUser"><input type="checkbox" id="AdvancedUser" value="Yes" />AdvancedUser</label></p>
     <p><label for="Space">Space:
     <input type="radio" id="Space2" name="Space" value="2G" class="radio" />2G
     <input type="radio" id="Space4" name="Space" value="4G" class="radio" />4G
     </label></p>  
        
 	<p><label for="address">Enter your Address or pick the Address<br />Address:<input type="text" id="address" size="30" maxlength="30" class="isAddress addressList"/>
       <select id="addressList" size="4" class="address">
     	<option value="cangzhou">Cangzhou</option>
        <option value="langfang">Langfang</option>
        <option value="handan">Handan</option>
        <option value="baoding">Baoding</option>
        <option value="zhangjiakou">Zhangjiakou</option>
      </select>
     </label></p> 
	
    <p><label for="postcode">Postcode:<input id="postcode" type="text" size="6" maxlength="6" class="isPostcode" /></label></p>
     
      <p><label for="image">Image URL:<input id="image" type="text" size="30" maxlength="30" class="isImage" /></label></p>
      
      <p><input type="submit" value="Submit" /><input type="reset" value="Reset" /></p>
</form>

</body>
</html>

CSS样式表(ValidForm.css):

@charset "utf-8";
/* CSS Document */
body{
	color:#000;
	background-color:#FFF;
}

input.invalid{
	/*当输入无效时,使用该样式*/
	background-color:#FF9;
	border:2px red inset;
}
label.invalid{
	/*当输入无效时,使用该样式*/
	color:#F00;
}

欢迎拍砖!

会把改进放到版本2.0里!



分享到:
评论

相关推荐

    JavaScript学习笔记,javascript基础知识,基础语法整理.pdf

    * 表单可以使用JavaScript来实现数据的验证 * 表单可以使用JavaScript来实现数据的提交 该资源涵盖了JavaScript的基础知识点,包括基本概念、函数、对象、时间对象、文字对象、图片应用和表单应用等内容。这些建议...

    JavaScript实战

    8.1.1 用JavaScript选择链接 218 8.1.2 确定链接的目标 219 8.1.3 不要打开链接 220 8.2 在新窗口中打开外部链接 221 8.3 创建新窗口 224 窗口属性 224 8.4 在页面上的一个窗口中打开页面 228 8.4.1 定制Greybox窗口...

    asp与asp.net的区别

    运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端...

    JavaWeb随堂讲义

    JavaWeb随堂讲义知识点总结 第一章 WEB概述 1.1 JAVAWEB简介:JavaWeb是一个基于Java语言的Web应用开发技术,用于构建动态Web...3.8 JS的函数:JavaScript语言的函数可以用于封装代码、实现模块化、提高代码复用性。

    Framework学习文档

    1. JavaScript是一种弱类型直译式脚本语言。 2. JavaScript中声明变量:var关键字。 3. BOM:Browser Object Model,浏览器对象模型。 4. DOM:Document Object Model,即文档对象模型。 5. JavaScript中事件的定义...

    asp.net知识库

    泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——...

    HTML5程序设计(第2版).[荷]Peter Lubbers(带详细书签).pdf

    8.2.2 表单验证 175 8.2.3 验证反馈 178 8.3 构建HTML5 Forms应用 180 8.4 小结 185 第9章 拖放 186 9.1 Web拖放发展史 186 9.2 HTML5拖放概述 187 9.2.1 蓝图 187 9.2.2 需要记住的事件 189 9.2.3 设置...

    JAVA上百实例源码以及开源项目源代码

    产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,...

    JAVA上百实例源码以及开源项目

    产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,...

Global site tag (gtag.js) - Google Analytics