`
matychen
  • 浏览: 172471 次
  • 性别: Icon_minigender_1
  • 来自: 武汉外来务工人员
社区版块
存档分类
最新评论

Jquery form validate验证框架(修改与扩展)二

阅读更多
最近在项目中要用到验证,所以重新看了下jquery的一个验证框架。
    作者已经更新到1.7 官方网站:A jQuery inline form validation, because validation is a mess
     此版本是在bluespring+官方1.7的基础上修改的。感谢bluespring
bluespring:原帖:配置超简单的Jquery form validate验证框架(修改与扩展)

0.2版本小小的bug修改。

修改地方:
/** Inline Form Validation Engine 1.7, jQuery plugin
 * 
 * Copyright(c) 2010, Cedric Dugas
 * http://www.position-relative.net
 *	
 * Form validation engine allowing custom regex rules to be added.
 * Thanks to Francois Duquette and Teddy Limousin 
 * and everyone helping me find bugs on the forum
 * Licenced under the MIT Licence
 * 
 * bluespring 修改1.6.4.1
 *	1.提供选项定制是否关闭提示框箭头 showArray
 * 	2.提供选项定制提示框是否在鼠标放上去的时刻出现还是一直出现 showOnMouseOver
 * 	3.提供选项定制input 效验错误样式
 * 
 * Quentin 修改
 * 	1. 无法全部去掉红色边框的bug   
 * 
 * matychen 修改
 * 	1.把css 中的errorform的padding-bottom改为margin-bottom ,如果不改,在checkbox的时候会遮挡。
 * 	2.当showOnMouseOver为true时。增加处理checkbox时,下面被占用,自己减少了top的高度,如果不减少top的高度,在checkbox的时候会遮挡。
 * 	3.修复了ie6的select遮挡div的bug
 * 	4.增加验证规则存放的属性名称
 * 	5.修改了ajax的发送到客户端的参数名称,返回值不用数组,直接用json对象。
 *		验证规则的名称validateError-->customAjaxRule
 */


  一、 原作者的代码会出现这种情况,前提是要开起bluespring的鼠标悬停提示(showOnMouseOver为true)。不开起悬停提示不会出现这种情况。

   发现是因为作者的设置div的padding,改为margin就不会有问题。祥见图片:





   二、 当然在ie6下面会出现select遮挡div的情况,只要在div里面加个iframe就可以了:
没修改前:


修改后:



   三、增加验证规则存放的属性名称
       可以不用定义规则在class里面,自己写个属性也可以:$("#formID").validationEngine({validateAttribute: "validate"});
      在input里面:<input value="" validate="validate[required,custom[noSpecialCaracters],length[0,20],ajax[ajaxUser]]" type="text" name="user" id="user" />
   四、修改了ajax的提交参数,和返回参数
if (!ajaxisError) {
                    $.ajax({
                        type: "POST",
                        url: postfile,
                        //async: true,//要验证的值						验证值的名称				验证规则的名称validateError-->customAjaxRule
                        data: "validateValue=" + fieldValue + "&validateId=" + fieldId + "&customAjaxRule=" + customAjaxRule + "&extraData=" + extraData,
                        beforeSend: function () { // BUILD A LOADING PROMPT IF LOAD TEXT EXIST		   			
                            if ($.validationEngine.settings.allrules[customAjaxRule].alertTextLoad) {
                                if (!$("div." + fieldId + "formError")[0]) {
                                    return $.validationEngine.buildPrompt(ajaxCaller, $.validationEngine.settings.allrules[customAjaxRule].alertTextLoad, "load");
                                } else {
                                    $.validationEngine.updatePromptText(ajaxCaller, $.validationEngine.settings.allrules[customAjaxRule].alertTextLoad, "load");
                                }
                            }
                        }, error: function (data, transport) {
                            $.validationEngine.debug("Ajax 错误: " + data.status + " " + transport);
                        }, success: function (data) { // GET SUCCESS DATA RETURN JSON
                        	//	jquery 已经转为json了,所以不要这句话,不然会报:missing ] after element list的错误
							//  data = eval("(" + data + ")"); // GET JSON DATA FROM PHP AND PARSE IT
                            // add by matychen 不用数组,直接用json对象。例如:{"validateId":"user","ajaxisError":false,"customAjaxRule":"ajaxUser"}
                            ajaxisError = data.ajaxisError; //true or false 
                            customAjaxRule = data.customAjaxRule; //验证规则的名称
                            ajaxCaller = $("#" + data.validateId)[0]; //验证值的id
                            //
                            fieldId = ajaxCaller;
                            ajaxErrorLength = $.validationEngine.ajaxValidArray.length;
                            existInarray = false;
							//对象就不能是"false"了
                            if (ajaxisError == false) { // DATA FALSE UPDATE PROMPT WITH ERROR;
                                _checkInArray(false); // Check if ajax validation alreay used on this field
                                if (!existInarray) { // Add ajax error to stop submit		 		
                                    $.validationEngine.ajaxValidArray[ajaxErrorLength] = new Array(2);
                                    $.validationEngine.ajaxValidArray[ajaxErrorLength][0] = fieldId;
                                    $.validationEngine.ajaxValidArray[ajaxErrorLength][1] = false;
                                    existInarray = false;
                                }
                                $.validationEngine.ajaxValid = false;
                                promptText += $.validationEngine.settings.allrules[customAjaxRule].alertText + "<br />";
                                $.validationEngine.updatePromptText(ajaxCaller, promptText, "", true);
                            } else {
                                _checkInArray(true);
                                $.validationEngine.ajaxValid = true;
                                if (!customAjaxRule) {
                                    $.validationEngine.debug("customAjaxRule没有返回值, 请检查. ");
                                }
                                if ($.validationEngine.settings.allrules[customAjaxRule].alertTextOk) { // NO OK TEXT MEAN CLOSE PROMPT	 			
                                    $.validationEngine.updatePromptText(ajaxCaller, $.validationEngine.settings.allrules[customAjaxRule].alertTextOk, "pass", true);
                                } else {
                                    ajaxValidate = false;
                                    $.validationEngine.closePrompt(ajaxCaller);
                                }
                            }

                            function _checkInArray(validate) {
                                for (x = 0; x < ajaxErrorLength; x++) {
                                    if ($.validationEngine.ajaxValidArray[x][0] == fieldId) {
                                        $.validationEngine.ajaxValidArray[x][1] = validate;
                                        existInarray = true;
                                    }
                                }
                            }
                        }
                    });
                }


在服务端的代码只要这样就可以了:
/**
	 * Ajax验证用户名
	 * 
	 * @param customAjaxRule
	 *            验证规则名称
	 * @param validateId
	 *            验证值的ID
	 * @param validateValue
	 *            验证值
	 * @return
	 */
	@RequestMapping(value = "/validateAjaxUser")
	@ResponseBody
	public Map<String, Object> validateAjaxUser(
			@RequestParam("customAjaxRule") String customAjaxRule,
			@RequestParam("validateId") String validateId,
			@RequestParam("validateValue") String validateValue) {
		logger.info("validateAjaxUser");
		Map<String, Object> map = new HashMap<String, Object>();
		// 验证用户名是否等于javaeye
		if ("javaeye".equals(validateValue)) {
			// 是否通过
			map.put("ajaxisError", true);
		} else {
			map.put("ajaxisError", false);
		}
		// 验证规则的名称
		map.put("customAjaxRule", customAjaxRule);
		// 验证值的ID
		map.put("validateId", validateId);
		return map;
	}



   其他的修改请看附件源码;如果还有什么bug的,欢迎大家提出,继续完善这个验证框架。

分享到:
评论
16 楼 matychen 2011-11-19  
cao_jj 写道
页面显示这个:customAjaxRule没有返回值, 请检查. 可是明明已经传了。alert的时候说undefined

你看看你传值是否标准,用firebug跟一下
15 楼 cao_jj 2011-11-19  
页面显示这个:customAjaxRule没有返回值, 请检查. 可是明明已经传了。alert的时候说undefined
14 楼 chenleijiangjun 2011-03-24  
楼主帮忙:ajax验证后错误提示信息位置不对,而且ajax验证错误后表单也能提交。请楼主帮忙,万分感谢!
13 楼 chenleijiangjun 2011-03-03  
showOnMouseOver: true,好像不起作用啊!能不能做到验证错误先把文本框的边框变红,然后鼠标浮上去在提示错误信息呢?谢谢!
12 楼 maike 2010-12-17  
非常感谢。正想用这个
11 楼 btdf007 2010-12-10  
发现了一个bug  在使用ajax验证的时候 如果该项没有失去焦点而是直接按回车提交 不会触发ajax验证
10 楼 zxingdream 2010-10-05  
zxingdream 写道
wafj999 写道
验证身份证的规则怎么整合进去啊?之前的都是"regex":"/^[a-zA-Z\u4E00-\u9FA5]+[a-zA-Z0-9_\u4E00-\u9FA5]+$/",
这样就可以但是身份证的校验必须通过
//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
地区、性别和身份证进行判断的正则表达式:
<script>
var
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:"国外"}

function cidInfo(sId){
var iSum=0
var info=""
if(!/^\d{17}(\d|x)$/i.test(sId))return false;
sId=sId.replace(/x$/i,"a");
if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";
sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
var d=new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
if(iSum%11!=1)return "Error:非法证号";
return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
}
这种来做
楼主知道怎么整合进去吗?

楼主 继续支持你啊,帮我们想想解决方案 或者 给个思路


这个我已经融合进去了,但错误信息不能显示我们函数里面的,除非alert();
在jquery.validationEngine-cn.js里找到$.validationEngineLanguage.allRules = {新添加代码:
"chkIDCard" :{
"nname" : "chkIDCard","alertText" : "* 请输入正确的身份证号."}

然后添加函数
function chkIDCard(){
var card=cidInfo(document.getElementById("idcard").value);
if(card!=true) return false;  
else return true;
}

调用的时候在class里这样调用:funcCall[chkIDCard]
但这样虽然可以用了 但是提示信息就固定了,呵呵 有待继续研究
9 楼 matychen 2010-10-04  
zxingdream 写道
楼主matychen好,
 
  是这样的 首先我不是J2EE学者,以前做验证用的是formvalidtor,但需要占一定的页面空间,偶然发现了...........

把你用的,和你写的例子打包,发站内信给我。
8 楼 zxingdream 2010-10-04  
楼主matychen好,
 
  是这样的 首先我不是J2EE学者,以前做验证用的是formvalidtor,但需要占一定的页面空间,偶然发现了formValidation插件,参照您的教程,简单会用了,
但关于ajaxuser 验证用户名异步调用这块 我还没测试成功, 研究了好久,都没发现突破点 发现您是用json框架提交json数据的, 但是 我现在不用json框架,怎么去提交?
直接request吗?
还有,我在 if (!ajaxisError) {$.ajax({
-------- 新加入测试----   
alert( "validateValue=" + fieldValue + "&validateId=" + fieldId + "&customAjaxRule=" + customAjaxRule + "&extraData=" + extraData);

                               
if (!customAjaxRule) {){--------}
-----代码片段-----
}}

然后 弹出的对话框:
validateValue= + 文本框内容(得到值)validateId=undefined& customAjaxRule=undefined &extraData=
我有两个问题:1,前台input数据都得到了,为什么validateId和customAjaxRule都是undfined? 难道数据没提交吗?
2,后台返回数据前台怎么处理?
3,日期验证好像没一直没通过,输入正确也不会消失
详情请看图片


还有 我下载的是
jquery_validate.rar (43.9 KB) 在这个版本下做的测试
jquery_validate-0.2.rar (44 KB)

希望楼主能给一个关于asp的demo 或者 jsp不用json框架 的demo 或者在线指导下,


在此万分感谢楼主
7 楼 心有余闲 2010-09-28  
我也在用,很不错。
6 楼 jtyb 2010-08-15  
感谢楼主的分享
5 楼 matychen 2010-08-15  
jtyb 写道
/commons/validate/jquery.bgiframe.js
这个js缺少。。。楼主是不是防进去


没有,那个开始是想修补在ie6下面select遮挡div的bug,不过后来自己实现了,就没有要了。
4 楼 jtyb 2010-08-14  
/commons/validate/jquery.bgiframe.js
这个js缺少。。。楼主是不是防进去

3 楼 matychen 2010-08-04  
Angel_Night 写道
每个人完善都是从头做起。。。在这个板块都看到2个人完善这东西了...

显然我是在别人的基础上改的
2 楼 Angel_Night 2010-08-04  
每个人完善都是从头做起。。。在这个板块都看到2个人完善这东西了...
1 楼 旭少版 2010-08-03  
支持一下~
我也在用这个

相关推荐

    jquery_validate验证框架

    **jQuery Validate验证框架** jQuery Validate是一个非常流行的JavaScript库,它为HTML表单提供了强大的验证功能。这个插件简化了客户端的表单验证过程,使得在网页应用中实现数据验证变得快速且易于实施。它适用于...

    jQuery validate框架的个性化验证

    通过以上介绍,我们可以看出 jQuery Validate 框架的强大之处,它提供了丰富的验证功能,允许开发者根据项目需求进行高度自定义,从而实现个性化的表单验证。在实际开发中,结合 CSS 和 JavaScript,可以打造出美观...

    jquery-form-validate

    `jQuery Form Validate` 是一个基于 jQuery 的强大表单验证框架,它为开发者提供了一种简洁、高效的方式来验证用户在网页表单中输入的数据。这个框架使得开发者无需编写复杂的JavaScript代码,就能实现对表单字段的...

    jQuery.validate 用法

    源码中,`Validator`类是整个验证框架的基石,它包含了验证规则、错误消息、错误容器等关键属性,以及各种验证方法和事件处理。 源码中的`addMethod`允许开发者扩展新的验证方法,`valid`方法则是验证表单元素的...

    JQueryValidate验证说明

    首先,使用`jQuery Validate`需要引入相关的文件,包括`jquery.validate.js`作为核心验证框架,`additional-methods.js`包含了一些额外的验证方法,`messages_cn.js`用于本地化消息,以及`jquery.validate.css`定义...

    jquery-validate前台验证框架,带详细使用方法

    根据给定的信息,本文将详细介绍jquery-validate前端验证框架的相关知识点,包括其基本概念、使用方法以及部分具体的验证规则实现。 ### 一、jquery-validate简介 `jquery-validate`是一款基于jQuery的强大表单...

    jQuery.validate.js

    jQuery.validate.js是一款强大的JavaScript插件,专为jQuery框架设计,用于实现前端表单验证,提供了丰富的验证规则和自定义选项,使得开发者能够轻松地构建具有高效验证功能的网页。 一、jQuery.validate.js的核心...

    jquery.validate是jquery旗下的一个验证框架

    以下是对这个验证框架的详细说明: ### 1. 插件简介 `jQuery Validate`通过与jQuery的无缝集成,使得验证用户输入变得简单快捷。它可以处理各种常见的验证需求,如必填项、电子邮件格式、URL、日期等,并且允许...

    jquery.validate.js验证框架_帮助_手册_文档_API_接口

    ### jQuery.validate.js 验证框架知识点详述 #### (一)可选项(options) 在使用 `jQuery.validate.js` 验证框架时,可选项是配置验证行为的重要部分。这些选项允许开发者自定义验证过程中的多种行为,包括调试...

    jquery validate验证示例

    在这个“jquery validate验证示例”压缩包中,很可能包含了 `jQuery Validate` 插件的核心文件以及一些示例代码,帮助开发者快速理解和使用这个插件。 首先,`jQuery Validate` 的核心功能包括: 1. **基本验证**...

    jquery 前端验证框架

    **二、jQuery验证框架的重要性** 前端验证不仅能够即时反馈用户输入错误,提高用户交互体验,还能减少服务器端的压力,避免无效请求。jQuery的验证框架提供了一套灵活、可定制的验证规则,使开发者可以快速构建表单...

    jquery validate依赖包及其帮助文档.rar

    《jQuery Validate插件详解与应用指南》 在Web开发领域,表单验证是不可或缺的一环,它能够确保用户输入的数据符合预设的规则,从而提高数据的准确性和系统的稳定性。jQuery Validate是一个强大的JavaScript库,专...

    jquery-validate 表单验证

    `jQuery Validate` 是一个强大的 JavaScript 库,专为 jQuery 框架设计,用于实现高效、灵活且易于使用的表单验证。它可以帮助开发者创建各种复杂的验证规则,确保用户输入的数据符合预设的要求,从而提高网站的安全...

    很不错的验证框架jquery

    标题中的“很不错的验证框架jquery”指的是jQuery Validation Plugin,这是一个非常流行且功能强大的JavaScript库,专门用于HTML表单验证。jQuery本身是一个轻量级的JavaScript库,极大地简化了DOM操作、事件处理和...

    jquery.validate.js表单验证[借鉴].pdf

    总的来说,`jQuery.validate.js` 提供了一个强大且灵活的框架,可以帮助开发者创建高效且用户体验良好的表单验证机制,从而确保收集到的数据准确无误。结合其丰富的自定义选项和预定义规则,可以适应各种复杂的验证...

    jquery验证框架学习

    **二、jQuery验证框架** jQuery验证框架是jQuery的一个插件,主要用于表单验证。它提供了丰富的配置选项和自定义规则,可以轻松实现对用户输入的实时检查,从而提高用户体验。这个框架能够轻松处理各种验证需求,如...

    jquery_validate之学习

    jQuery Validate是一个强大的JavaScript库,它为jQuery框架提供了简单易用的表单验证功能。这个插件以其灵活性和丰富的定制选项,深受开发者喜爱。本文将深入探讨jQuery Validate的使用方法、核心功能和常见应用场景...

    jQuery验证框架

    ### jQuery验证框架详解 #### 一、概述 jQuery Validation Plugin 是一个非常强大的验证插件,它可以帮助开发者轻松地实现客户端表单验证功能。此插件是基于jQuery开发的,因此可以充分利用jQuery的强大功能来简化...

    jquery验证框架,好用实用。。。

    **jQuery验证框架详解** jQuery Validate 是一个非常流行的前端验证插件,它为HTML表单提供了强大的验证功能。这个插件是jQuery库的一个扩展,能够帮助开发者轻松实现对用户输入数据的有效性检查,确保数据在提交前...

    可扩展表单验证bootstrap-validate

    4. **自定义验证**:如果需要自定义验证规则,可以通过`$.fn.validate.extend()`方法扩展验证器。 ### 示例 ```html &lt;form id="example-form"&gt; 请输入有效的电子邮件地址"&gt; 提交 &lt;/form&gt; $(document).ready...

Global site tag (gtag.js) - Google Analytics