PageSourceSearch

https://www.rpccn.com/template/subsite/asset/js/member/formValidator-4.0.1.js

js rpccn.com collected 2026-10-03 02:39:13 UTC 37,757 bytes, 1,176 lines download raw bytes

1//====================================================================================================
2// [插件名称] jQuery formValidator
3//----------------------------------------------------------------------------------------------------
4// [描    述] jQuery formValidator表单验证插件,它是基于jQuery类库,实现了js脚本于页面的分离。对一个表
5//            单对象,你只需要写一行代码就可以轻松实现20种以上的脚本控制。现支持一个表单元素累加很多种
6//            校验方式,采用配置信息的思想,而不是把信息写在表单元素上,能比较完美的实现ajax请求。
7//----------------------------------------------------------------------------------------------------
8// [作者网名] 猫冬	
9// [邮    ç®±] [email protected]
10// [作者博客] http://wzmaodong.cnblogs.com
11// [QQ群交流] 74106519
12// [更新日期] 2011-05-22
13// [版 本 号] ver4.0.1
14//====================================================================================================
15(function($) {
16
17$.formValidator = 
18{
19	//全局配置
20	initConfig : function(controlOptions)
21	{
22		var settings = 
23		{
24			debug:false,								//调试模式
25			validatorGroup : "1",						//分组号
26			alertMessage:false,							//是否为弹出窗口提示模式
27			validObjects:[],							//参加校验的控件集合
28			ajaxObjects:"",							//传到服务器的控件列表
29			forceValid:false,							//控件输入正确之后,才允许失去焦点
30			onSuccess: function() {return true;},		//提交成功后的回调函数
31			onError: $.noop,						//提交失败的回调函数
32			submitOnce:false,							//页面是否提交一次,不会停留
33			formID:"",					//表单ID
34			submitButtonID:"",			//提交按钮ID
35			autoTip: false,				//是否自动构建提示层
36			tidyMode:false,				//精简模式
37			errorFocus:true,			//第一个错误的控件获得焦点
38			wideWord:true,				//一个汉字当做2个长度
39			status:"",					//提交的状态:submited、sumbiting、sumbitingWithAjax
40			submitAfterAjaxPrompt : "当前有数据正在进行服务器端校验,请稍候",	//控件失去焦点后,触发ajax校验,没有返回结果前的错误提示
41			validCount:0,			//含ajaxValidator的控件个数
42			ajaxCountSubmit:0,		//提交的时候触发的ajax验证个数
43			ajaxCountValid:0,		//失去焦点时候触发的ajax验证个数
44			inIframe:false
45			
46		};
47		controlOptions = controlOptions || {};
48		$.extend(settings, controlOptions);
49		//如果是精简模式,发生错误的时候,第一个错误的控件就不获得焦点
50		if(settings.tidyMode){settings.errorFocus=false};
51		//如果填写了表单和按钮,就注册验证事件
52		if(settings.formID!=""){
53			$("#"+settings.formID).submit(function(){return $.formValidator.bindSubmit(settings);});
54		}
55		else if(settings.submitButtonID!="")
56		{
57			$("#"+settings.submitButtonID).click(function(){return $.formValidator.bindSubmit(settings);});
58		}
59		$('body').data(settings.validatorGroup, settings);
60	},
61	
62	//调用验证函数
63	bindSubmit : function(settings)
64	{
65		if (settings.ajaxCountValid > 0 && settings.submitAfterAjaxPrompt != "") {
66			alert(settings.submitAfterAjaxPrompt);	
67			return false;
68		}
69		return $.formValidator.pageIsValid(settings.validatorGroup);
70	},
71	
72	//各种校验方式支持的控件类型
73	sustainType : function(id,setting)
74	{
75		var elem = $("#"+id).get(0);
76		var srcTag = elem.tagName;
77		var stype = elem.type;
78		switch(setting.validateType)
79		{
80			case "InitValidator":
81				return true;
82			case "InputValidator":
83				return (srcTag == "INPUT" || srcTag == "TEXTAREA" || srcTag == "SELECT");
84			case "CompareValidator":
85				return ((srcTag == "INPUT" || srcTag == "TEXTAREA") ? (stype != "checkbox" && stype != "radio") : false);
86			case "AjaxValidator":
87				return (stype == "text" || stype == "textarea" || stype == "file" || stype == "password" || stype == "select-one");
88			case "RegexValidator":
89				return ((srcTag == "INPUT" || srcTag == "TEXTAREA") ? (stype != "checkbox" && stype != "radio") : false);
90			case "FunctionValidator":
91			    return true;
92		}
93	},
94    
95	//如果validator对象对应的element对象的validator属性追加要进行的校验。
96	appendValid : function(id, setting )
97	{
98		//如果是各种校验不支持的类型,就不追加到。返回-1表示没有追加成功
99		if(!$.formValidator.sustainType(id,setting)) return -1;
100		var srcjo = $("#"+id).get(0);   
101		//重新初始化
102		if (setting.validateType=="InitValidator" || srcjo.settings == undefined ){srcjo.settings = new Array();}   
103		var len = srcjo.settings.push( setting );
104		srcjo.settings[len - 1].index = len - 1;
105		return len - 1;
106	},
107	
108	//设置显示信息
109	setTipState : function(elem,showclass,showmsg)
110	{
111		var initConfig = $('body').data(elem.validatorGroup);
112	    var tip = $("#"+elem.settings[0].tipID);
113		if(showmsg==null || showmsg=="")
114		{
115			tip.hide();
116		}
117		else
118		{
119			if(initConfig.tidyMode)
120			{
121				//显示和保存提示信息
122				$("#fv_content").html(showmsg);
123				elem.Tooltip = showmsg;
124				if(showclass!="onError"){tip.hide();}
125			}
126			else
127			{
128				tip.show().removeClass().addClass( showclass+" ui-message" ).html( showmsg );
129			}
130		}
131	},
132		
133	//把提示层重置成原始提示(如果有defaultPassed,应该设置为onCorrect)
134	resetTipState : function(validatorGroup)
135	{
136		if(validatorGroup == undefined){validatorGroup = "1"};
137		var initConfig = $('body').data(validatorGroup);
138		$.each(initConfig.validObjects,function(){
139			var elem = this.get(0);
140			var setting = elem.settings[0];
141			var passed = setting.defaultPassed;
142			$.formValidator.setTipState(elem, passed ? "onCorrect" : "onShow", passed ? setting.onCorrect : setting.onShow);	
143		});
144	},
145	
146	//设置错误的显示信息
147	setFailState : function(tipID,showmsg)
148	{
149	    var tip = $("#"+tipID);
150	    tip.removeClass().addClass("onError ui-message ui-warning").html(showmsg);
151	},
152
153	//根据单个对象,正确:正确提示,错误:错误提示
154	showMessage : function(returnObj)
155	{
156	    var id = returnObj.id;
157		var elem = $("#"+id).get(0);
158		var isValid = returnObj.isValid;
159		var setting = returnObj.setting;//正确:setting[0],错误:对应的setting[i]
160		var showmsg = "",showclass = "";
161		var intiConfig = $('body').data(elem.validatorGroup);
162		if (!isValid)
163		{		
164			showclass = "onError";
165			if(setting.validateType=="AjaxValidator")
166			{
167				if(setting.lastValid=="")
168				{
169				    showclass = "onLoad";
170				    showmsg = setting.onWait;
171				}
172				else
173				{
174				    showmsg = setting.onError;
175				}
176			}
177			else
178			{
179				showmsg = (returnObj.errormsg==""? setting.onError : returnObj.errormsg);
180				
181			}
182			if(intiConfig.alertMessage)		
183			{
184				if(elem.validValueOld!=$(elem).val()){alert(showmsg);}   
185			}
186			else
187			{
188				$.formValidator.setTipState(elem,showclass,showmsg);
189			}
190		}
191		else
192		{		
193			//验证成功后,如果没有设置成功提示信息,则给出默认提示,否则给出自定义提示;允许为空,值为空的提示
194			showmsg = $.formValidator.isEmpty(id) ? setting.onEmpty : setting.onCorrect;
195			$.formValidator.setTipState(elem,"onCorrect",showmsg);
196		}
197		return showmsg;
198	},
199
200	showAjaxMessage : function(returnObj)
201	{
202		var elem = $("#"+returnObj.id).get(0);
203		var setting = elem.settings[returnObj.ajax];
204		var validValueOld = elem.validValueOld;
205		var validvalue = $(elem).val();
206		returnObj.setting = setting;
207		//defaultPassed还未处理
208		if(validValueOld!= validvalue || validValueOld == validvalue && !elem.onceValided)
209		{
210			$.formValidator.ajaxValid(returnObj);
211		}
212		else
213		{
214			if(setting.isValid!=undefined && !setting.isValid){
215				elem.lastshowclass = "onError"; 
216				elem.lastshowmsg = setting.onError;
217			}
218			$.formValidator.setTipState(elem,elem.lastshowclass,elem.lastshowmsg);
219		}
220	},
221
222	//获取指定字符串的长度
223    getLength : function(id)
224    {
225        var srcjo = $("#"+id);
226		var elem = srcjo.get(0);
227        var sType = elem.type;
228        var len = 0;
229        switch(sType)
230		{
231			case "text":
232			case "hidden":
233			case "password":
234			case "textarea":
235			case "file":
236		        var val = srcjo.val();
237				var initConfig = $('body').data(elem.validatorGroup);
238				if (initConfig.wideWord)
239				{
240					for (var i = 0; i < val.length; i++) 
241					{
242						len = len + ((val.charCodeAt(i) >= 0x4e00 && val.charCodeAt(i) <= 0x9fa5) ? 2 : 1); 
243					}
244				}
245				else{
246					len = val.length;
247				}
248		        break;
249			case "checkbox":
250			case "radio": 
251				len = $("input[type='"+sType+"'][name='"+srcjo.attr("name")+"']:checked").length;
252				break;
253		    case "select-one":
254		        len = elem.options ? elem.options.selectedIndex : -1;
255				break;
256			case "select-multiple":
257				len = $("select[name="+elem.name+"] option:selected").length;
258				break;
259	    }
260		return len;
261    },
262    
263	//结合empty这个属性,判断仅仅是否为空的校验情况。
264    isEmpty : function(id)
265    {
266        return ($("#"+id).get(0).settings[0].empty && $.formValidator.getLength(id)==0);
267    },
268    
269	//对外调用:判断单个表单元素是否验证通过,不带回调函数
270    isOneValid : function(id)
271    {
272	    return $.formValidator.oneIsValid(id).isValid;
273    },
274    
275	//验证单个是否验证通过,正确返回settings[0],错误返回对应的settings[i]
276	oneIsValid : function (id)
277	{
278		var returnObj = new Object();
279		var elem = $("#"+id).get(0);
280		returnObj.initConfig = $('body').data(elem.validatorGroup);
281		returnObj.id = id;
282		returnObj.ajax = -1;
283		returnObj.errormsg = "";       //自定义错误信息
284	    var settings = elem.settings;
285	    var settingslen = settings.length;
286		var validateType;
287		//只有一个formValidator的时候不检验
288		if (settingslen==1){settings[0].bind=false;}
289		if(!settings[0].bind){return null;}
290		for ( var i = 0 ; i < settingslen ; i ++ )
291		{   
292			if(i==0){
293				//如果为空,直接返回正确
294				if($.formValidator.isEmpty(id)){
295					returnObj.isValid = true;
296					returnObj.setting = settings[0];
297					break;
298				}
299				continue;
300			}
301			returnObj.setting = settings[i];
302			validateType = settings[i].validateType;
303			//根据类型触发校验
304			switch(validateType)
305			{
306				case "InputValidator":
307					$.formValidator.inputValid(returnObj);
308					break;
309				case "CompareValidator":
310					$.formValidator.compareValid(returnObj);
311					break;
312				case "RegexValidator":
313					$.formValidator.regexValid(returnObj);
314					break;
315				case "FunctionValidator":
316					$.formValidator.functionValid(returnObj);
317					break;
318				case "AjaxValidator":
319					//如果是ajax校验,这里直接取上次的结果值
320					returnObj.ajax = i
321					break;
322			}
323			//校验过一次
324			elem.onceValided = true;
325			if(!settings[i].isValid) {
326				returnObj.isValid = false;
327				returnObj.setting = settings[i];
328				break;
329			}else{
330				returnObj.isValid = true;
331				returnObj.setting = settings[0];
332				if (settings[i].validateType == "AjaxValidator"){break};
333			}
334		}
335		return returnObj;
336	},
337
338	//验证所有需要验证的对象,并返回是否验证成功(如果曾经触发过ajaxValidator,提交的时候就不触发校验,直接读取结果)
339	pageIsValid : function (validatorGroup)
340	{
341	    if(validatorGroup == undefined){validatorGroup = "1"};
342		var isValid = true,returnObj,firstErrorMessage="",errorMessage;
343		var error_tip = "^",thefirstid,name,name_list="^"; 	
344		var errorlist = new Array();
345		//设置提交状态、ajax是否出错、错误列表
346		var initConfig = $('body').data(validatorGroup);
347		initConfig.status = "sumbiting";
348		initConfig.ajaxCountSubmit = 0;
349		//遍历所有要校验的控件,如果存在ajaxValidator就先直接触发
350		$.each(initConfig.validObjects,function()
351		{
352			if (this.settings[0].bind && this.validatorAjaxIndex!=undefined && this.onceValided == undefined) {
353				returnObj = $.formValidator.oneIsValid(this.id);
354				if (returnObj.ajax == this.validatorAjaxIndex) {
355					initConfig.status = "sumbitingWithAjax";
356					$.formValidator.ajaxValid(returnObj);
357				}
358			}
359		});
360		//如果有提交的时候有触发ajaxValidator,所有的处理都放在ajax里处理
361		if(initConfig.ajaxCountSubmit > 0){return false}
362		//遍历所有要校验的控件
363		$.each(initConfig.validObjects,function()
364		{
365			//只校验绑定的控件
366			if(this.settings[0].bind){
367				name = this.name;
368				//相同name只校验一次
369				if (name_list.indexOf("^"+name+"^") == -1) {
370					onceValided = this.onceValided == undefined ? false : this.onceValided;
371					if(name){name_list = name_list + name + "^"};
372					returnObj = $.formValidator.oneIsValid(this.id);
373					if (returnObj) {
374						//校验失败,获取第一个发生错误的信息和ID
375						if (!returnObj.isValid) {
376							//记录不含ajaxValidator校验函数的校验结果
377							isValid = false;
378							errorMessage = returnObj.errormsg == "" ? returnObj.setting.onError : returnObj.errormsg;
379							errorlist[errorlist.length] = errorMessage;
380							if (thefirstid == null) {thefirstid = returnObj.id};
381							if(firstErrorMessage==""){firstErrorMessage=errorMessage};
382						}
383						//为了解决使用同个TIP提示问题:后面的成功或失败都不覆盖前面的失败
384						if (!initConfig.alertMessage) {
385							var tipID = this.settings[0].tipID;
386							if (error_tip.indexOf("^" + tipID + "^") == -1) {
387								if (!returnObj.isValid) {error_tip = error_tip + tipID + "^"};
388								$.formValidator.showMessage(returnObj);
389							}
390						}
391					}
392				}
393			}
394		});
395		
396		//成功或失败进行回调函数的处理,以及成功后的灰掉提交按钮的功能
397		if(isValid)
398		{
399            initConfig.onSuccess();
400			if(initConfig.submitOnce){$(":submit,:button,:reset").attr("disabled",true);}
401			return false;
402		}
403		else
404		{
405			initConfig.onError(firstErrorMessage, $("#" + thefirstid).get(0), errorlist);
406			if (thefirstid && initConfig.errorFocus) {$("#" + thefirstid).focus()};
407		}
408		initConfig.status="init";
409		return !initConfig.debug && isValid;
410	},
411
412	//ajax校验
413	ajaxValid : function(returnObj)
414	{
415		var id = returnObj.id;
416	    var srcjo = $("#"+id);
417		var elem = srcjo.get(0);
418		var initConfig = returnObj.initConfig;
419		var settings = elem.settings;
420		var setting = settings[returnObj.ajax];
421		var ls_url = setting.url;
422		//获取要传递的参数
423		var validatorGroup = elem.validatorGroup;
424		var initConfig = $('body').data(validatorGroup);
425		var parm = $(initConfig.ajaxObjects).serialize();
426		//添加触发的控件名、随机数、传递的参数
427		var parm = encodeURIComponent(srcjo.val())+"-"+Math.random();//"clientid="+id+"&"+id+"="+encodeURIComponent(srcjo.val());
428			ls_url = ls_url + parm;//(ls_url.indexOf("?")>0?("&"+ parm) : ("?"+parm));
429		//parm = "clientid=" + id + "&" +(setting.randNumberName ? setting.randNumberName+"="+((new Date().getTime())+Math.round(Math.random() * 10000)) : "") + (parm.length > 0 ? "&" + parm : "");
430		//ls_url = ls_url + (ls_url.indexOf("?") > -1 ? ("&" + parm) : ("?" + parm));
431		//发送ajax请求
432		//alert(setting.type);
433		if(setting.type=='post')
434		{
435			setting.data=srcjo.attr('id')+"="+srcjo.val();
436		}
437		$.ajax(
438		{	
439			type : setting.type, 
440			url : ls_url, 
441			cache : setting.cache,
442			data : setting.data, 
443			async : setting.async, 
444			timeout : setting.timeout, 
445			dataType : setting.dataType, 
446			success : function(data, textStatus, jqXHR){
447				var lb_ret,ls_status,ls_msg;
448				$.formValidator.dealAjaxRequestCount(validatorGroup,-1);
449				//根据业务判断设置显示信息
450				lb_ret = setting.success(data, textStatus, jqXHR);
451				setting.isValid = lb_ret;
452				if(lb_ret){
453					ls_status = "onCorrect";
454					ls_msg = data.data!=undefined?data.data:settings[0].onCorrect;
455				}else{
456					ls_status = "onError";
457					ls_msg = data.data!=undefined?data.data:setting.onError;
458				}
459				$.formValidator.setTipState(elem,ls_status,ls_msg);
460				//提交的时候触发了ajax校验,等ajax校验完成,无条件重新校验
461				if(returnObj.initConfig.status=="sumbitingWithAjax" && returnObj.initConfig.ajaxCountSubmit == 0)
462				{
463					if (initConfig.formID != "") {
464						$('#' + initConfig.formID).trigger('submit');
465					}else if (initConfig.formID != ""){
466						$('#' + initConfig.submitButtonID).trigger('click');
467					}
468				}
469			},
470			complete : function(jqXHR, textStatus){
471				if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":false})};
472				setting.complete(jqXHR, textStatus);
473			}, 
474			beforeSend : function(jqXHR, configs){
475				//本控件如果正在校验,就中断上次
476				if (this.lastXMLHttpRequest) {this.lastXMLHttpRequest.abort()};
477				this.lastXMLHttpRequest = jqXHR;
478				//再服务器没有返回数据之前,先回调提交按钮
479				if(setting.buttons && setting.buttons.length > 0){setting.buttons.attr({"disabled":true})};
480				var isValid = setting.beforeSend(jqXHR,configs);
481				if(isValid)
482				{
483					setting.isValid = false;		//如果前面ajax请求成功了,再次请求之前先当作错误处理
484					$.formValidator.setTipState(elem,"onLoad",settings[returnObj.ajax].onWait);
485				}
486				setting.lastValid = "-1";
487				if(isValid){$.formValidator.dealAjaxRequestCount(validatorGroup,1);}
488				return isValid;
489			}, 
490			error : function(jqXHR, textStatus, errorThrown){
491				$.formValidator.dealAjaxRequestCount(validatorGroup,-1);
492			    $.formValidator.setTipState(elem,"onError",setting.onError);
493			    setting.isValid = false;
494				setting.error(jqXHR, textStatus, errorThrown);
495			},
496			processData : setting.processData 
497		});
498	},
499	
500	//处理ajax的请求个数
501	dealAjaxRequestCount : function(validatorGroup,val)
502	{
503		var initConfig = $('body').data(validatorGroup);
504		initConfig.ajaxCountValid = initConfig.ajaxCountValid + val;
505		if (initConfig.status == "sumbitingWithAjax") {
506			initConfig.ajaxCountSubmit = initConfig.ajaxCountSubmit + val;
507		}
508	},
509
510	//对正则表达式进行校验(目前只针对input和textarea)
511	regexValid : function(returnObj)
512	{
513		var id = returnObj.id;
514		var setting = returnObj.setting;
515		var srcTag = $("#"+id).get(0).tagName;
516		var elem = $("#"+id).get(0);
517		var isValid;
518		//如果有输入正则表达式,就进行表达式校验
519		if(elem.settings[0].empty && elem.value==""){
520			setting.isValid = true;
521		}
522		else 
523		{
524			var regexArray = setting.regExp;
525			setting.isValid = false;
526			if((typeof regexArray)=="string") regexArray = [regexArray];
527			$.each(regexArray, function() {
528			    var r = this;
529			    if(setting.dataType=="enum"){r = eval("regexEnum."+r);}			
530			    if(r==undefined || r=="") 
531			    {
532			        return false;
533			    }
534			    isValid = (new RegExp(r, setting.param)).test($(elem).val());
535			    
536			    if(setting.compareType=="||" && isValid)
537			    {
538			        setting.isValid = true;
539			        return false;
540			    }
541			    if(setting.compareType=="&&" && !isValid) 
542			    {
543			        return false
544			    }
545            });
546            if(!setting.isValid) setting.isValid = isValid;
547		}
548	},
549	
550	//函数校验。返回true/false表示校验是否成功;返回字符串表示错误信息,校验失败;如果没有返回值表示处理函数,校验成功
551	functionValid : function(returnObj)
552	{
553		var id = returnObj.id;
554		var setting = returnObj.setting;
555	    var srcjo = $("#"+id);
556		var lb_ret = setting.fun(srcjo.val(),srcjo.get(0));
557		if(lb_ret != undefined) 
558		{
559			if((typeof lb_ret) === "string"){
560				setting.isValid = false;
561				returnObj.errormsg = lb_ret;
562			}else{
563				setting.isValid = lb_ret;
564			}
565		}
566	},
567	
568	//对input和select类型控件进行校验
569	inputValid : function(returnObj)
570	{
571		var id = returnObj.id;
572		var setting = returnObj.setting;
573		var srcjo = $("#"+id);
574		var elem = srcjo.get(0);
575		var val = srcjo.val();
576		var sType = elem.type;
577		var len = $.formValidator.getLength(id);
578		var empty = setting.empty,emptyError = false;
579		switch(sType)
580		{
581			case "text":
582			case "hidden":
583			case "password":
584			case "textarea":
585			case "file":
586				if (setting.type == "size") {
587					empty = setting.empty;
588					if(!empty.leftEmpty){
589						emptyError = (val.replace(/^[ \s]+/, '').length != val.length);
590					}
591					if(!emptyError && !empty.rightEmpty){
592						emptyError = (val.replace(/[ \s]+$/, '').length != val.length);
593					}
594					if(emptyError && empty.emptyError){returnObj.errormsg= empty.emptyError}
595				}
596			case "checkbox":
597			case "select-one":
598			case "select-multiple":
599			case "radio":
600				var lb_go_on = false;
601				if(sType=="select-one" || sType=="select-multiple"){setting.type = "size";}
602				var type = setting.type;
603				if (type == "size") {		//获得输入的字符长度,并进行校验
604					if(!emptyError){lb_go_on = true}
605					if(lb_go_on){val = len}
606				}
607				else if (type =="date" || type =="datetime")
608				{
609					var isok = false;
610					if(type=="date"){lb_go_on = isDate(val)};
611					if(type=="datetime"){lb_go_on = isDate(val)};
612					if(lb_go_on){val = new Date(val);setting.min=new Date(setting.min);setting.max=new Date(setting.max);};
613				}else{
614					stype = (typeof setting.min);
615					if(stype =="number")
616					{
617						val = (new Number(val)).valueOf();
618						if(!isNaN(val)){lb_go_on = true;}
619					}
620					if(stype =="string"){lb_go_on = true;}
621				}
622				setting.isValid = false;
623				if(lb_go_on)
624				{
625					if(val < setting.min || val > setting.max){
626						if(val < setting.min && setting.onErrorMin){
627							returnObj.errormsg= setting.onErrorMin;
628						}
629						if(val > setting.min && setting.onErrorMax){
630							returnObj.errormsg= setting.onErrorMax;
631						}
632					}
633					else{
634						setting.isValid = true;
635					}
636				}
637				break;
638		}
639	},
640	
641	//对两个控件进行比较校验
642	compareValid : function(returnObj)
643	{
644		var id = returnObj.id;
645		var setting = returnObj.setting;
646		var srcjo = $("#"+id);
647	    var desjo = $("#"+setting.desID );
648		var ls_dataType = setting.dataType;
649		
650		curvalue = srcjo.val();
651		ls_data = desjo.val();
652		if(ls_dataType=="number")
653        {
654            if(!isNaN(curvalue) && !isNaN(ls_data)){
655				curvalue = parseFloat(curvalue);
656                ls_data = parseFloat(ls_data);
657			}
658			else{
659			    return;
660			}
661        }
662		if(ls_dataType=="date" || ls_dataType=="datetime")
663		{
664			var isok = false;
665			if(ls_dataType=="date"){isok = (isDate(curvalue) && isDate(ls_data))};
666			if(ls_dataType=="datetime"){isok = (isDateTime(curvalue) && isDateTime(ls_data))};
667			if(isok){
668				curvalue = new Date(curvalue);
669				ls_data = new Date(ls_data)
670			}
671			else{
672				return;
673			}
674		}
675		
676	    switch(setting.operateor)
677	    {
678	        case "=":
679	            setting.isValid = (curvalue == ls_data);
680	            break;
681	        case "!=":
682	            setting.isValid = (curvalue != ls_data);
683	            break;
684	        case ">":
685	            setting.isValid = (curvalue > ls_data);
686	            break;
687	        case ">=":
688	            setting.isValid = (curvalue >= ls_data);
689	            break;
690	        case "<": 
691	            setting.isValid = (curvalue < ls_data);
692	            break;
693	        case "<=":
694	            setting.isValid = (curvalue <= ls_data);
695	            break;
696			default :
697				setting.isValid = false;
698				break; 
699	    }
700	},
701	
702	//定位漂浮层
703	localTooltip : function(e)
704	{
705		e = e || window.event;
706		var mouseX = e.pageX || (e.clientX ? e.clientX + document.body.scrollLeft : 0);
707		var mouseY = e.pageY || (e.clientY ? e.clientY + document.body.scrollTop : 0);
708		$("#fvtt").css({"top":(mouseY+2)+"px","left":(mouseX-40)+"px"});
709	},
710	
711	reloadAutoTip : function(validatorGroup)
712	{
713		if(validatorGroup == undefined) validatorGroup = "1";
714		var initConfig = $('body').data(validatorGroup);
715		$.each(initConfig.validObjects,function()
716		{
717			if(initConfig.autoTip && !initConfig.tidyMode)
718			{
719				//获取层的ID、相对定位控件的ID和坐标
720				var setting = this.settings[0];
721				var relativeID = "#"+setting.relativeID;
722				var offset = $(relativeID ).offset();
723				var y = offset.top;
724				var x = $(relativeID ).width() + offset.left;
725				$("#"+setting.tipID).parent().show().css({left: x+"px", top: y+"px"});			
726			}
727		});
728	}
729};
730
731//每个校验控件必须初始化的
732$.fn.formValidator = function(cs) 
733{
734	var setting = 
735	{
736		validatorGroup : "1",
737		empty :false,
738		autoModify : false,
739		onShow :"请输入内容",
740		onFocus: "请输入内容",
741		onCorrect: "输入正确",
742		onEmpty: "输入内容为空",
743		defaultValue : null,
744		bind : true,
745		ajax : false,
746		validateType : "InitValidator",
747		tipCss : 
748		{
749			"left" : "10px",
750			"top" : "1px",
751			"height" : "20px",
752			"width":"250px"
753		},
754		triggerEvent:"blur",
755		forceValid : false,
756		tipID : null,
757		relativeID : null,
758		index : 0
759	};
760
761	//获取该校验组的全局配置信息
762	cs = cs || {};
763	if(cs.validatorGroup == undefined){cs.validatorGroup = "1"};
764	
765	var initConfig = $('body').data(cs.validatorGroup);
766	
767	//校验索引号,和总记录数
768	initConfig.validCount += 1;
769	
770	//如果为精简模式,tipCss要重新设置初始值
771	if(initConfig.tidyMode){setting.tipCss = {"left" : "2px","width":"22px","height":"22px","display":"none"}};
772	
773	//弹出消息提示模式,自动修复错误
774	if(initConfig.alertMessage){setting.autoModify=true};
775	
776	//先合并整个配置(深度拷贝)
777	$.extend(true,setting, cs);
778
779	return this.each(function(e)
780	{
781		//记录该控件的校验顺序号和校验组号
782		this.validatorIndex = initConfig.validCount - 1;
783		this.validatorGroup = cs.validatorGroup;
784		var jqobj = $(this);
785		//自动形成TIP
786		var setting_temp = {};
787		$.extend(true,setting_temp, setting);
788		var tip = setting_temp.tipID ? setting_temp.tipID : this.id+"Tip";
789		if(initConfig.autoTip)
790		{
791			if(!initConfig.tidyMode)
792			{				
793				//获取层的ID、相对定位控件的ID和坐标
794				if($("body [id="+tip+"]").length==0)
795				{		
796					var relativeID = setting_temp.relativeID ? setting_temp.relativeID : this.id;
797					var offset = $("#"+relativeID ).position();
798					var y = offset.top;
799					var x = $("#"+relativeID ).width() + offset.left;
800					var formValidateTip = $("<div class='formValidateTip'></div>");
801					if(initConfig.inIframe){formValidateTip.hide();}
802					formValidateTip.appendTo($("body")).css({left: x+"px", top: y+"px"}).prepend($('<div id="'+tip+'"></div>').css(setting_temp.tipCss));
803					setting.relativeID = relativeID ;
804				}
805			}
806			else
807			{
808				jqobj.showTooltips();
809			}
810		}
811		//每个控件都要保存这个配置信息、为了取数方便,冗余一份控件总体配置到控件上
812		setting.tipID = tip;
813		$.formValidator.appendValid(this.id,setting);
814
815		//保存控件ID
816		if($.inArray(jqobj,initConfig.validObjects) == -1)
817		{
818			if (setting_temp.ajax) {
819				var ajax = initConfig.ajaxObjects;
820				initConfig.ajaxObjects = ajax + (ajax != "" ? ",#" : "#") + this.id;
821			}
822			initConfig.validObjects.push(this);
823		}
824
825		//初始化显示信息
826		if(!initConfig.alertMessage){
827			$.formValidator.setTipState(this,"onShow",setting.onShow);
828		}
829
830		var srcTag = this.tagName.toLowerCase();
831		var stype = this.type;
832		var defaultval = setting.defaultValue;
833		//处理默认值
834		if(defaultval){
835			jqobj.val(defaultval);
836		}
837
838		if(srcTag == "input" || srcTag=="textarea")
839		{
840			//注册获得焦点的事件。改变提示对象的文字和样式,保存原值
841			jqobj.focus(function()
842			{	
843				if(!initConfig.alertMessage){
844					//保存原来的状态
845					var tipjq = $("#"+tip);
846					this.lastshowclass = tipjq.attr("class");
847					this.lastshowmsg = tipjq.html();
848					$.formValidator.setTipState(this,"onFocus",setting.onFocus);
849				}
850				if (stype == "password" || stype == "text" || stype == "textarea" || stype == "file") {
851					this.validValueOld = jqobj.val();
852				}
853			});
854			//注册失去焦点的事件。进行校验,改变提示对象的文字和样式;出错就提示处理
855			jqobj.bind(setting.triggerEvent, function(){
856				var settings = this.settings;
857				var returnObj = $.formValidator.oneIsValid(this.id);
858				if(returnObj==null){return;}
859				if(returnObj.ajax >= 0) 
860				{
861					$.formValidator.showAjaxMessage(returnObj);
862				}
863				else
864				{
865					var showmsg = $.formValidator.showMessage(returnObj);
866					if(!returnObj.isValid)
867					{
868						//自动修正错误
869						var auto = setting.autoModify && (this.type=="text" || this.type=="textarea" || this.type=="file");
870						if(auto)
871						{
872							$(this).val(this.validValueOld);
873							if(!initConfig.alertMessage){$.formValidator.setTipState(this,"onShow",setting.onShow)};
874						}
875						else
876						{
877							if(initConfig.forceValid || setting.forceValid){
878								alert(showmsg);this.focus();
879							}
880						}
881					}
882				}
883			});
884		} 
885		else if (srcTag == "select")
886		{
887			jqobj.bind({
888				//获得焦点
889				focus: function(){	
890					if (!initConfig.alertMessage) {
891						$.formValidator.setTipState(this, "onFocus", setting.onFocus)
892					};
893				},
894				//失去焦点
895				blur: function(){$(this).trigger("change")},
896				//选择项目后触发
897				change: function(){
898					var returnObj = $.formValidator.oneIsValid(this.id);	
899					if(returnObj==null){return;}
900					if ( returnObj.ajax >= 0){
901						$.formValidator.showAjaxMessage(returnObj);
902					}else{
903						$.formValidator.showMessage(returnObj); 
904					}
905				}
906			});
907		}
908	});
909}; 
910
911$.fn.inputValidator = function(controlOptions)
912{
913	var settings = 
914	{
915		isValid : false,
916		min : 0,
917		max : 99999999999999,
918		type : "size",
919		onError:"输入错误",
920		validateType:"InputValidator",
921		empty:{leftEmpty:true,rightEmpty:true,leftEmptyError:null,rightEmptyError:null}
922	};
923	controlOptions = controlOptions || {};
924	$.extend(true, settings, controlOptions);
925	return this.each(function(){
926		$.formValidator.appendValid(this.id,settings);
927	});
928};
929
930$.fn.compareValidator = function(controlOptions)
931{
932	var settings = 
933	{
934		isValid : false,
935		desID : "",
936		operateor :"=",
937		onError:"输入错误",
938		validateType:"CompareValidator"
939	};
940	controlOptions = controlOptions || {};
941	$.extend(true, settings, controlOptions);
942	return this.each(function(){
943		$.formValidator.appendValid(this.id,settings);
944	});
945};
946
947$.fn.regexValidator = function(controlOptions)
948{
949	var settings = 
950	{
951		isValid : false,
952		regExp : "",
953		param : "i",
954		dataType : "string",
955		compareType : "||",
956		onError:"输入的格式不正确",
957		validateType:"RegexValidator"
958	};
959	controlOptions = controlOptions || {};
960	$.extend(true, settings, controlOptions);
961	return this.each(function(){
962		$.formValidator.appendValid(this.id,settings);
963	});
964};
965
966$.fn.functionValidator = function(controlOptions)
967{
968	var settings = 
969	{
970		isValid : true,
971		fun : function(){this.isValid = true;},
972		validateType:"FunctionValidator",
973		onError:"输入错误"
974	};
975	controlOptions = controlOptions || {};
976	$.extend(true, settings, controlOptions);
977	return this.each(function(){
978		$.formValidator.appendValid(this.id,settings);
979	});
980};
981
982$.fn.ajaxValidator = function(controlOptions)
983{
984	var settings = 
985	{
986		type : "GET",
987		url : "",
988		dataType : "html",
989		timeout : 100000,
990		data : null,
991		async : true,
992		cache : false,
993		beforeSend : function(){return true;},
994		success : function(){return true;},
995		complete : function(){},
996		processData : true,
997		error : function(){},
998		isValid : false,
999		lastValid : "",
1000		buttons : null,
1001		oneceValid : false,
1002		randNumberName : "rand",
1003		onError:"服务器校验没有通过",
1004		onWait:"正在等待服务器返回数据",
1005		ajaxExistsError:"前面的校验尚未完成,请稍候...",
1006		validateType:"AjaxValidator"
1007			
1008	};
1009	controlOptions = controlOptions || {};
1010	$.extend(true, settings, controlOptions);
1011	return this.each(function()
1012	{
1013		var initConfig = $('body').data(this.validatorGroup);
1014		var ajax = initConfig.ajaxObjects;
1015		if((ajax+",").indexOf("#"+this.id+",") == -1)
1016		{
1017			initConfig.ajaxObjects = ajax + (ajax != "" ? ",#" : "#") + this.id;
1018		}
1019		this.validatorAjaxIndex = $.formValidator.appendValid(this.id,settings);
1020	});
1021};
1022
1023//指定控件显示通过或不通过样式
1024$.fn.defaultPassed = function(onShow)
1025{
1026	return this.each(function()
1027	{
1028		var settings = this.settings;
1029		settings[0].defaultPassed = true;
1030		for ( var i = 1 ; i < settings.length ; i ++ )
1031		{   
1032			settings[i].isValid = true;
1033			if(!$('body').data(settings[0].validatorGroup).alertMessage){
1034				var ls_style = onShow ? "onShow" : "onCorrect";
1035				$.formValidator.setTipState(this,ls_style,settings[0].onCorrect);
1036			}
1037		}
1038	});
1039};
1040
1041//指定控件不参加校验
1042$.fn.unFormValidator = function(unbind)
1043{
1044	return this.each(function()
1045	{
1046		this.settings[0].bind = !unbind;
1047		if(unbind){
1048			$("#"+this.settings[0].tipID).hide();
1049		}else{
1050			$("#"+this.settings[0].tipID).show();
1051		}
1052	});
1053};
1054
1055//显示漂浮显示层
1056$.fn.showTooltips = function()
1057{
1058	if($("body [id=fvtt]").length==0){
1059		fvtt = $("<div id='fvtt' style='position:absolute;z-index:56002'></div>");
1060		$("body").append(fvtt);
1061		fvtt.before("<iframe src='about:blank' class='fv_iframe' scrolling='no' frameborder='0'></iframe>");
1062		
1063	}
1064	return this.each(function()
1065	{
1066		jqobj = $(this);
1067		s = $("<span class='top' id=fv_content style='display:block'></span>");
1068		b = $("<b class='bottom' style='display:block' />");
1069		this.tooltip = $("<span class='fv_tooltip' style='display:block'></span>").append(s).append(b).css({"filter":"alpha(opacity:95)","KHTMLOpacity":"0.95","MozOpacity":"0.95","opacity":"0.95"});
1070		//注册事件 
1071		jqobj.bind({
1072			mouseover : function(e){
1073				$("#fvtt").append(this.tooltip);
1074				$("#fv_content").html(this.Tooltip);
1075				$.formValidator.localTooltip(e);
1076			},
1077			mouseout : function(){
1078				$("#fvtt").empty();
1079			},
1080			mousemove: function(e){
1081				$("#fv_content").html(this.Tooltip);
1082				$.formValidator.localTooltip(e);
1083			}
1084		});
1085	});
1086}
1087})(jQuery);
1088
1089
1090// formValidatorRegex.js
1091var regexEnum = 
1092{
1093	intege:"^-?[1-9]\\d*$",					//整数
1094	intege1:"^[1-9]\\d*$",					//正整数
1095	intege2:"^-[1-9]\\d*$",					//负整数
1096	num:"^([+-]?)\\d*\\.?\\d+$",			//数字
1097	num1:"^[1-9]\\d*|0$",					//正数(正整数 + 0)
1098	num2:"^-[1-9]\\d*|0$",					//负数(负整数 + 0)
1099	decmal:"^([+-]?)\\d*\\.\\d+$",			//浮点数
1100	decmal1:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$",  	//正浮点数
1101	decmal2:"^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$",  //负浮点数
1102	decmal3:"^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$",  //浮点数
1103	decmal4:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$",   //非负浮点数(正浮点数 + 0)
1104	decmal5:"^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$",  //非正浮点数(负浮点数 + 0)
1105
1106	email:"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件
1107	color:"^[a-fA-F0-9]{6}$",				//颜色
1108	url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$",	//url
1109	chinese:"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",					//仅中文
1110	ascii:"^[\\x00-\\xFF]+$",				//仅ACSII字符
1111	zipcode:"^\\d{6}$",						//邮编
1112	mobile:"^(13|15|18|17|16|19)[0-9]{9}$",				//手机
1113	ip4:"^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$",	//ip地址
1114	notempty:"^\\S+$",						//非空
1115	picture:"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$",	//图片
1116	rar:"(.*)\\.(rar|zip|7zip|tgz)$",								//压缩文件
1117	date:"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$",					//日期
1118	qq:"^[1-9]*[1-9][0-9]*$",				//QQ号码
1119	tel:"^(([0\\+]\\d{2,3}-)?(0\\d{2,3})-)?(\\d{7,8})(-(\\d{3,}))?$",	//电话号码的函数(包括验证国内区号,国际区号,分机号)
1120	username:"^\\w+$",						//用来用户注册。匹配由数字、26个英文字母或者下划线ç
1120»„成的字符串
1121	letter:"^[A-Za-z]+$",					//字母
1122	letter_u:"^[A-Z]+$",					//大写字母
1123	letter_l:"^[a-z]+$",					//小写字母
1124	idcard:"^[1-9]([0-9]{14}|[0-9]{17})$",	//身份证
1125	myusername:"^[\\w\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$"					//仅中文
1126}
1127
1128var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} 
1129
1130function isCardID(sId){ 
1131	var iSum=0 ;
1132	var info="" ;
1133	if(!/^\d{17}(\d|x)$/i.test(sId)) return "你输入的身份证长度或格式错误"; 
1134	sId=sId.replace(/x$/i,"a"); 
1135	if(aCity[parseInt(sId.substr(0,2))]==null) return "你的身份证地区非法"; 
1136	sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); 
1137	var d=new Date(sBirthday.replace(/-/g,"/")) ;
1138	if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "身份证上的出生日期非法"; 
1139	for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) ;
1140	if(iSum%11!=1) return "你输入的身份证号非法"; 
1141	return true;//aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女") 
1142} 
1143
1144
1145
1146
1147//短时间,形如 (13:04:06)
1148function isTime(str)
1149{
1150	var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
1151	if (a == null) {return false}
1152	if (a[1]>24 || a[3]>60 || a[4]>60)
1153	{
1154		return false;
1155	}
1156	return true;
1157}
1158
1159//短日期,形如 (2003-12-05)
1160function isDate(str)
1161{
1162	var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
1163	if(r==null)return false; 
1164	var d= new Date(r[1], r[3]-1, r[4]); 
1165	return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
1166}
1167
1168//长时间,形如 (2003-12-05 13:04:06)
1169function isDateTime(str)
1170{
1171	var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; 
1172	var r = str.match(reg); 
1173	if(r==null) return false; 
1174	var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); 
1175	return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
1176}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.