4

私はjQuery Validateを使用しており、フィールドの 1 つが変更されるたびに (または、それらの 1 つが正常に検証されるたびに) フィールドのグループを再検証したいと考えています。これまでの私の試みは、無限ループを作成するだけです。

これは可能ですか、それともプラグインの設計により不可能ですか?

(具体的には、グループ Y の少なくとも X を入力する必要があるメソッドを持っています。それが真になったらすぐに、これらすべてのフィールドを再検証したいと思います。現在、エラー メッセージを消去しています。独自のコードを使用していますが、これはハックです。フォームが再送信されるまで、無関係な検証の問題も非表示になります。)

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 に答える