1. 程式人生 > >jQuery 表單驗證控制元件 比較簡單

jQuery 表單驗證控制元件 比較簡單

學習jquery, 自己寫的一個基於jQuery的表單驗證練手 比較簡單

 下載地位  http://download.csdn.net/detail/lpy3654321/7816687  不要積分的

頁面效果: 



HTML 程式碼: validate.html

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>驗證</title>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="jquery-validate-src.js"></script>
<script type="text/javascript" src="jquery-datePicker-src.js"></script>
<script type="text/javascript">
	$(function(){
		//日期控制,未完	jquery-datePicker-src.js
		//$("#from").datePicker();
		
		$("#submi").click(function(e){
			// 被動驗證表單
			$("#form").validForm();
		});

		$("#reset").click(function(){
			// 關閉所有的提示塊
			$("#form").tootipFadeOut();
		});
		
		$("#form").validate({
		//	有input後面新增,暫時意思不大
		//	after:"<div class=\"warnValidate\">22222222222222222</div>",
		
			// 自定義 message
		//	message : {required: "必選欄位22{0}22"},
		
			//提示塊的偏移量
			offsetX : 85,
			offsetY : -15
			
			// 未通過驗證後執行的方法,,如果使用將替換預設的顯示提示塊
	/*		falseFun:function(input){
				alert("cccc  sss  "+e);
			},
	*/
			// 通過驗證後執行的方法,如果使用將替換預設的隱藏提示塊
	/* 		trueFun:function(input){
				
			}
	*/
		});
		
	})
</script>
<style>
/* 驗證的CSS */
.warnValidate {
	position: absolute;
 	border:3px solid red;
 	border-radius:5px;
 	margin :3px; padding : 1px;
	background-color: #FF9D00;
	display:none;
}

/* 日期控制元件CSS*/
.day{
	text-align: center;
}
.shangYue{
	color: #CCCCCC;
}
.xiaYue{
	color: #CCCCCC;
}

</style>
</head>
<body>
value: <input id="content" type="text" size="50"/> 失去焦點Input的value
<br/>
validate: <input id="rule" type="text" size="50" />	失去焦點Input的validate屬性

<form id="form">
<!-- 改變表單位置,測試提示塊是否在input旁邊顯示 -->
	<table style="padding: 30px 0px 0px 150px;">
		<tr>
			<td style="height:35px;">
				<label>1</label>
			</td>
			<td style="height:35px;">
				<input id="1" type="text" value="該表單沒有validate屬性,所以不驗證" size="40" />
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>2minlength</label>
			</td>
			<td style="height:35px;">
				<input id="2" type="text" validate="{required:true,minlength:2,date:true}" value="2014-08-18" size="40" />
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>3maxlength能</label>
			</td>
			<td style="height:35px;">
				<input id="3" type="text" validate="{required:true,maxlength:5,max:10}" size="40" />
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>4</label>
			</td>
			<td style="height:35px;">
				<input id="4" type="text" validate="{required:true,rangelength:[2,5]}" value="4" size="40" />
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>required</label>
			</td>
			<td style="height:35px;">
				<textarea id="5_required" validate="{required:true}"></textarea>
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>6_remote</label>
			</td>
			<td style="height:35px;">
				<textarea id="6_remote" name="6_remote" validate="{required:true,remote:'remote-true.json'}"></textarea>遠端資料是假的,存在remote-true.json檔案
			</td>
		</tr>
		<tr>
			<td style="height:35px;">
				<label>7_equalTo</label>
			</td>
			<td style="height:35px;">
				<textarea id="7_equalTo" name="7_equalTo" validate="{equalTo:'#6_remote'}"></textarea>
			</td>
		</tr>
	</table>
	
		<label>another</label><input id="5" type="text" validate="{required:true,email:true}" value="
[email protected]
"/><br/> <input type="submit" value="提交"/> <b> type="submit" 顯示驗證未通的訊息塊</b> <br/><input id="reset" type="reset" value="重置"> <b> type="reset" 重置並隱藏驗證未通的訊息塊</b> </form> <a id="submi" href="#" onclick="return false;">A標籤提交</a> <b> A標籤的單擊事件觸發</b> <hr/> <div id="ddddd"></div> </body> </html>


JS 程式碼 jquery-validate-src.js

/*! 
	表單驗證
	liupengyuan
 */
(function($){
	
	var options = null;
	
	// TODO 需要這此處完善 驗證的元素集合 [textarea , select , input , audio]**************************************
	// 統一呼叫表單元素選擇器selector
	var selector = ":input[type!=submit][type!=reset][type!=button]";
	
	/**
	 * 1.初始化方法
	 * $("form").validate({});
	 * 初始化時,會在每個表單元素後插入一個DIV class為warnValidate,如<div class="warnValidate"></div>  也可以自定義   
	 */
	$.fn.validate = function( _options ){
		options = _options || {};
		
		var $form = $(this);	//form本身
		/*
		 * 統一呼叫選擇器selector
		 * 功能是找到該form表單內的所以表單元素 input select textarea
		 */
		var $inputArr = $form.find(selector);	
		
		// 定義一個dom的jQuery物件
		var after = $(options.after || "<div class=\"warnValidate\"></div>");
		// 初始化時,會在每個表單元素後插入一個DIV class為warnValidate,如<div class="warnValidate"></div>  也可以自定義   
	//	after.attr("id","validate_title_" + $inputArr.context.id || $inputArr.context.name);
		$inputArr.after(after);
		
		/*
		 * 為form新增submit事件,事件內的方法就是驗證表單.
		 * 並 return 驗證結果 true或false,如果為false就停止submit事件,阻止表單提交.
		 */
		$form.submit(function( e ){
			return validForm( $form );
		});
		
		/*
		 * focus 表單元素得到焦點時隱藏提示塊
		 * 當表單元素得到焦點時,說明可能是正在修改表單內容,所以隱藏提示塊
		 */
		$inputArr.focus(function( e ){
			
			var $thisInput = $(this);
			expressfadeOut( $thisInput )
			
		});
		
		/*
		 * blur 表單元素失去焦點時開始驗證表單
		 * 當表單元素失去焦點時,說明可能已經修改完表單內容,所以需要驗證該表單失去焦點的表單
		 */
		$inputArr.blur(function( e ){
			
			var $thisInput = $(this);
			var flag = validInput ($thisInput );
			
		});
		
		
		/*
		 * 當點選到已顯示的驗證提示資訊塊時,將該資訊塊隱藏
		 */
		$(".warnValidate").click(function(){
			$(this).fadeOut(200);
		});
	}
	
	/**
	 * 2.主動驗證表單FORM
	 * ajax提交表單,呼叫此方法
	 * 引數 : $("form").validForm();
	 * 返回值 : boolean true 該表單通過驗證; false 該表單未能驗通過證
	 */
	$.fn.validForm = function(){
		return validForm( $(this) );
	}
	
	/**
	 * 3.隱藏表單下所有的提示塊
	 * 當表單在DIALOG裡的時候,關閉DIALOG時,需要呼叫此方法.
	 * 引數 : $("form").tootipFadeOut();
	 */
	$.fn.tootipFadeOut = function(){
		var tootipArr = $( this ).find(".warnValidate");
		return tootipArr.fadeOut(200);
	}
	
	/**
	 * 驗證表單INPUT
	 * 私有方法
	 * 引數 : $input 表單元素的 jquery 物件
	 * 返回值 : boolean 返回true該元素通過驗證 ; 返回false該表單未能驗通過證
	 */
	validInput = function ( $input ){
		
		var validateRuleStr = $input.attr("validate");
		// 如果元素無validate屬性,則略過該元素的驗證,繼續下一個驗證
		if( !validateRuleStr ){
			return true;
		}
	
		
		
		// 驗證內容是否通過驗證
		var resultArr = valid( $input , validateRuleStr );

		if( resultArr.length <= 0 ){	// 驗證通過 返回true
			

			// 如果options 內提供 trueFun 方法,執行使用者提供的方法,否則執行預設的 expressfadeOut( $input , resultArr );
			if( options.trueFun ){
				options.trueFun( $input , resultArr );
			}else{
				expressfadeOut( $input , resultArr );
			}
			return true;
			
		}else{	// 驗證未通過返回false
			
			// 如果options 內提供 falseFun 方法,執行使用者提供的方法,否則執行預設的 expressFadeIn( $input , resultArr );
			if( options.falseFun ){
				options.falseFun( $input , resultArr );
			}else{
				expressFadeIn( $input , resultArr );
			}
			return false;
			
		}
	}
	
	/**
	 * 驗證表單FORM
	 * 私有方法
	 * 引數 $obj : form 的 jquery 物件
	 * 返回值 : boolean true 該表單通過驗證,可以提交; false 該表單未能驗通過證,不可以提交
	 */
	validForm = function( $obj ){
		// 預設是通過驗證,但只要其中一項未通過,那麼該標識就被賦為 false 
		var flag = true;	
		
		/*
		 * 統一呼叫選擇器selector
		 * 功能是找到該form表單內的所以表單元素 input select textarea
		 */
		var $inputArr = $obj.find( selector );
		
		/*
		 * 對所有表單元素輪循驗證
		 * 只要其中的一項未能通過驗證,就認為該form不能提交,所以該方法的返回false
		 */
		$inputArr.each(function(i,e){
			if( !validInput( $(e) ) ){
				//如果其中有未能通過驗證的,將 flag 標識賦為 false
				flag = false;
			}
		});
		return flag;
	}
	
	/**
	 * 未能通過驗證的規則的訊息物件陣列
	 * 引數 : _contentStr 要驗證的內容 String
	 * 		  _ruleStrArr 驗證規則 Sting[]
	 * 返回值 : Object[] 未能通過驗證的規則的訊息物件陣列
	 */
	valid = function( $input , validateRuleStr ){
		
		var _contentStr = $input.val();
		//去空格
		var content = $.trim( _contentStr );
		var cc = content||"";
		var vv = validateRuleStr||"";
		$("#content").val(cc);
		$("#rule").val(vv);
		
		var validateRuleObj =  eval( "(" + validateRuleStr+")" );
		
		var resultsArr = new Array();
		for(var o in validateRuleObj){
			var ruleValues = validateRuleObj[o];
			
			if(!ruleValues)continue;
			
			// 呼叫驗證規則物件方法
			var resultObj = ruleObj[o]( content , ruleValues , $input.attr("name") || $input.attr("id"));
			
			//呼叫驗證後的提示訊息
			var message = $.extend(messageObj,options.message)[o];
			
			/*
				將提示訊息關鍵字存在數組裡,這樣比較容易替換佔位符
			*/
			var messagesArr = new Array();
			var ruleValuesType =  ( typeof ruleValues ).toLowerCase();
			if(ruleValuesType == "string" || ruleValuesType == "number"){
				messagesArr.push(ruleValues);
			} else if(ruleValues.length){
				for(var i=0;i<ruleValues.length;i++){
					messagesArr.push(ruleValues[i]); 
				}
			}
			
			/*
				將存放在數組裡的關鍵字,替換訊息的佔位符
			*/
			for(var i=0;i<messagesArr.length;i++){
				var m = messagesArr[i];
				message = message.replace("{" + i + "}"  , m );
			}
			/*
			//	如果未通過驗證的規則新增到結果陣列中
			*/
			if( !resultObj.result ){
				var _result = $.extend(resultObj,{
					rule : o ,
					message : message
				});
				resultsArr.push( _result );
			}
		}

		return resultsArr;
	}
	
	/*
		規則欄位方法物件
	*/
	var ruleObj = {
	
		// 必輸欄位
		required:function( content , ruleValues ){
		
			var _result = { 
				result : content.length > 0 ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 使用ajax方法呼叫   驗證輸入值
		remote:function( content , ruleValues ,fieldName ){
			var _result = {
		//		result : result ,
				ruleValues : ruleValues
			};
			var _data = {};
			_data[ fieldName ] = content;
			$.ajax({
				url:ruleValues[0] ,
				data : _data ,
				dataType : "json" , type : "post",
				async : false ,
				success:function( result , status , xhr ){
					_result.result = result;
				}
			});
			
			return _result;
		},
		// 必須輸入正確格式的電子郵件
		email:function( content , ruleValues ){
			
			var _result = {
				result : /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(content) ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入正確格式的網址
		url:function( content , ruleValues ){
			var _result = { 
				result : true ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入正確格式的日期
		date:function( content , ruleValues ){
			var _result = { 
				result : !/Invalid|NaN/.test( new Date( content ).toString() ) ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入正確格式的日期(ISO),例如:2009-06-23,1998/01/22 只驗證格式,不驗證有效性
		dateISO:function( content , ruleValues ){
			var _result = { 
				result : /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( content ) ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入合法的數字(負數,小數)
		number:function( content , ruleValues ){
			var _result = { 
				result : /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( content ) ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入整數
		digits:function( content , ruleValues ){
			var _result = { 
				result : /^\d+$/.test( content ) ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 必須輸入合法的信用卡號
		creditcard:function( content , ruleValues ){
			var _result = { 
				result : true ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入值必須和#field相同
		equalTo:function( content , ruleValues ){
			var selector = ruleValues;

			var _result = { 
				result : content === $(selector).val() ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入擁有合法字尾名的字串(上傳檔案的字尾)
		accept:function( content , ruleValues ){
			var _result = { 
				result : false ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入長度最多是{0}的字串(漢字算一個字元)
		maxlength:function( content , ruleValues ){
			var _result = { 
				result :  content.length <=  ruleValues,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入長度最小是{0}的字串(漢字算一個字元)
		minlength:function( content , ruleValues ){
			var _result = { 
				result : content.length >= ruleValues ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入長度必須介於 {0} 和 {1} 之間的字串)(漢字算一個字元)
		rangelength:function( content , ruleValues ){

			var _result = { 
				result : content.length >=  ruleValues[0] && content.length <= ruleValues[1] ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入值必須介於 {0} 和 {1} 之間
		range:function( content , ruleValues ){
			var _result = { 
				result : false ,
				ruleValues : ruleValues
			};
			return _result;
		},
		// 輸入值不能大於{0}
		max:function( content , ruleValues ){
			// 選驗證是否為數字
			var numObj = this.number( content , ruleValues );

			var _result = { 
				result : Number(content) <= ruleValues ,
				ruleValues : ruleValues
			};

			return numObj.result ? _result : numObj;
		},
		// 輸入值不能小於{0}
		min:function( content , ruleValues ){
			// 選驗證是否為數字
			var numObj = this.number( content , ruleValues );
			
			var _result = { 
				result : Number(content) >= ruleValues ,
				ruleValues : ruleValues
			};

			return numObj.result ? _result : numObj;
		}
	}
	
	
	
	/**
	 * 顯示在頁面彈出提示塊資訊
	 * 私有方法
	 */
	var expressFadeIn = function( $input , resultArr ){
		
		var width = $input.width();
		var height = 30;
		
		var offset = $input.offset();
		
		var left = offset.left;
		var top = offset.top;
	
		var x = left;
		var y = top - height;//
		
		if( options.offsetX ){
			x = x + options.offsetX;
		}
		
		if( options.offsetY ){
			y = y - options.offsetY;
		}
	
		var cssOjb = {
			"left" : x,
			"top" : y
		};
		$input.next().css( cssOjb ).html("<b>" + resultArr[0].message + "</b>").fadeIn();
	}
	
	/**
	 * 隱藏在頁面彈出提示塊資訊
	 * 私有方法
	 */
	var expressfadeOut = function( $input ){
		$input.next().fadeOut();
	}
	/*
		訊息物件
	*/
	var messageObj = {
		required: "必選欄位",
		remote: "請修正該欄位",
		email: "請輸入正確格式的電子郵件",
		url: "請輸入合法的網址",
		date: "請輸入合法的日期",
		dateISO: "請輸入合法的日期 (ISO).",
		number: "請輸入合法的數字",
		digits: "只能輸入整數",
		creditcard: "請輸入合法的信用卡號",
		equalTo: "請再次輸入與 {0} 相同的值",
		accept: "請輸入擁有合法字尾名的字串",
		maxlength: "請輸入一個 長度最多是 {0} 的字串",
		minlength: "請輸入一個 長度最少是 {0} 的字串",
		rangelength: "請輸入 一個長度介於 {0} 和 {1} 之間的字串",
		range: "請輸入一個介於 {0} 和 {1} 之間的值",
		max: "請輸入一個最大為{0} 的值",
		min: "請輸入一個最小為{0} 的值"
	}
})(jQuery);