4

我正在使用jQuery Validate并希望在其中一个字段发生更改时重新验证一组字段(或者可能,只要其中一个字段成功验证)。到目前为止,我的尝试只是创建了无限循环。

这是可能的,还是插件设计排除了它?

(具体来说,我有一个方法,至少需要填写 Y 组中的 X 组,一旦这是真的,我希望所有这些字段都重新验证。目前我正在清除他们的错误消息使用我自己的代码,但这是一个 hack - 它还会隐藏不相关的验证问题,直到重新提交表单。)

4

2 回答 2

11

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>

于 2010-04-07T02:32:49.100 回答
1

不知道这是如何工作的,但只是发现删除了以下部分:

if(!$(element).data('reval')) {
        var fields = $(options[1], element.form);
        fields.data('reval', true).valid();
        fields.data('reval', false);
}

来自主代码的代码使所有验证按预期正常工作。:)

于 2011-01-19T13:19:20.303 回答