【发布时间】:2011-11-29 13:53:42
【问题描述】:
我正在使用 jquery validate 并且我已经设置了组。但是,我无法找出将每个组与其包含的各个字段分开验证的最佳方法。
为了说明这一点:
我有城市、州和邮编(按此顺序)。如果有人输入了 zip 的值,他们应该得到肯定的确认(我已经通过输入使该部分使用绿色复选标记),但是,只要状态和 zip 为空,组验证消息仍应显示。
在各种尝试中,我遇到了以下问题: - 用户跳过“城市”并显示验证消息,但是当为“zip”提供输入时,验证消息消失。 (这很奇怪......也许是一个错误?) - 用户输入“城市”,他们甚至在进入“状态”之前就收到了组错误消息 - 用户输入“城市”但不会得到复选标记,因为组中的其他输入为空
我倾向于通过覆盖“onfocusout”事件来解决这个问题(通过让它在 focusout 上检查组中的所有输入)但不确定是否有更好的方法通过一些 validate 的内置方法
谢谢!
*更新
我提出的解决方案相当丑陋,而且它们都不能始终如一地工作,下面是一个例子,它导致我上面列出的第一个问题的反面。现在验证消息仅在组中的最后一个字段被填写时显示。
也许组验证依赖于组中最后一个测试的验证结果?
无论如何...这是我目前所想出的烂摊子:
设置组:
groups : { location : 'city state zip' }
为组创建一个规则(注意它必须是一个数组以保持顺序):
rules : { location : ['city, 'state', 'zip']}
现在覆盖 onfocusout:
onfocusout : function(el) {
var groups = this.groups
, elName = el.name
, elGroup = groups[elName]
, $el = $(el)
if (!this.checkable(el) ){
this.element(el));
}
// If the element belongs to a group, validate all elements in the group
// that come before the current element
if (elGroup) {
var groupMembers = this.settings.rules[elGroup];
for (var i=0; i<groupMembers.length; i++) {
if ( groupMembers[i] === elName ) {
break;
}
this.element( $('[name="' + groupMembers[i] + '"]') );
}
}
}
【问题讨论】:
标签: javascript jquery forms validation plugins