我正在使用jQuery Validate,并且只要其中一个字段发生更改(或者可能,只要其中一个字段成功验证),就会重新验证一组字段。到目前为止,我的尝试只是创造了无限循环。
这可能,或插件设计是否排除它?
(具体来说,我已经a method that requires at least X of group Y to be filled out了,一旦确实如此,我希望所有这些字段都重新验证。目前我正在用我自己的代码清除他们的错误消息,但是这是一个黑客 - 它还隐藏了不相关的验证问题,直到重新提交表单。)
答案 0 :(得分:12)
验证方法有一个few options to support re-validating on change,即:
$(".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()
让元素知道不会导致无限循环。正在编辑的实际元素,模糊(验证触发器的正常原因)重新验证仅您在组中指定的选择器中的其他元素,因此不像我的注释那样整个表单。 .it只在最小数量的元素上触发它。
答案 1 :(得分:1)
不知道这是如何工作的,但是,发现删除了以下部分:
if(!$(element).data('reval')) {
var fields = $(options[1], element.form);
fields.data('reval', true).valid();
fields.data('reval', false);
}
来自主代码的代码使所有验证工作正常和预期。 :)