我正在使用jQuery Validate并希望在其中一个字段发生更改时重新验证一组字段(或者可能,只要其中一个字段成功验证)。到目前为止,我的尝试只是创建了无限循环。
这是可能的,还是插件设计排除了它?
(具体来说,我有一个方法,至少需要填写 Y 组中的 X 组,一旦这是真的,我希望所有这些字段都重新验证。目前我正在清除他们的错误消息使用我自己的代码,但这是一个 hack - 它还会隐藏不相关的验证问题,直到重新提交表单。)
我正在使用jQuery Validate并希望在其中一个字段发生更改时重新验证一组字段(或者可能,只要其中一个字段成功验证)。到目前为止,我的尝试只是创建了无限循环。
这是可能的,还是插件设计排除了它?
(具体来说,我有一个方法,至少需要填写 Y 组中的 X 组,一旦这是真的,我希望所有这些字段都重新验证。目前我正在清除他们的错误消息使用我自己的代码,但这是一个 hack - 它还会隐藏不相关的验证问题,直到重新提交表单。)
validate 方法有几个选项来支持对更改进行重新验证,即:
$(".selector").validate({
onfocusout: true,
onkeyup: true,
onclick: true,
//The rest of your options
});
这些都默认为false
,但应该提供您在问题中提到的功能。
根据评论更新:给定一个简单的测试表格,如下所示:
<form action="get">
<div><input type="text" name="part1" class="part"></div>
<div><input type="text" name="part2" class="part"></div>
<div><input type="text" name="part3" class="part"></div>
<div><input type="text" name="part4" class="part"></div>
<input type="submit" value="Submit" />
</form>
jQuery 将如下所示:
jQuery.validator.addMethod("require_from_group", function(value, element, options) {
var valid = $(options[1], element.form).filter(function() {
return $(this).val();
}).length >= options[0];
if(!$(element).data('reval')) {
var fields = $(options[1], element.form);
fields.data('reval', true).valid();
fields.data('reval', false);
}
return valid;
}, jQuery.format("Please fill out at least {0} of these fields."));
$("form").validate({
rules: {
part1: { require_from_group: [2,".part"] },
part2: { require_from_group: [2,".part"] },
part3: { require_from_group: [2,".part"] },
part4: { require_from_group: [2,".part"] }
}
});
你可以在这里玩一个演示,看看这是否是你所追求的:http: //jsfiddle.net/mhmBs/
这里使用的方法.data()
是让元素知道不会导致无限循环。正在编辑的实际元素,模糊(验证触发的正常原因)仅重新验证您在组中指定的选择器中的其他元素,所以不像我的评论那样整个表单......它只是在触发它最少元素数。</p>
不知道这是如何工作的,但只是发现删除了以下部分:
if(!$(element).data('reval')) {
var fields = $(options[1], element.form);
fields.data('reval', true).valid();
fields.data('reval', false);
}
来自主代码的代码使所有验证按预期正常工作。:)