2012-05-06 49 views
6

私がrequire_from_groupを使用するときはいつも、それは他のバリデーションをすべて無効にします。なぜどんなアイデア?Jquery .validate require_from_group

また、「Telefon」と「Mobitel」をグループ化してrequire_from_groupを適用する方法はありますか?

$(document).ready(function(){ 
    $("#fncMain").validate(
    { 
    /*groups:{Call:"Telefon Mobitel"},*/ 
    rules:{ 
     Davcna:{required:true,exactlength:5, digits:true}, 
     Idzav:{required:true,exactlength:5, digits:true}, 
     Maticna:{required:true,exactlength:5, digits:true}, 
     Telefon:{require_from_group: [1,".callme"]}, 
     Mobitel:{require_from_group: [1,".callme"]} 
    }, 
    messages:{ 

    }} 
    ); 
    }); 

ここに含まれていない他のフィールドはすべて、単純な「必須」クラスを使用します。私がrequire_from_groupのルールを "Telefon"と "Mobitel"に適用すると、他のすべてのフィールドバリデーションは正常に動作します。

ありがとうございました。

EDIT HTML:http://cl.ly/29391q0Q3G231T2I380m(ここではそれを投稿するには長すぎる)

+1

あなたは少なくともこのルールに関連してこのフォームのhtmlを共有できますか?すなわち、どのようなものがクラス 'callme'などを持っています – Ryley

+0

@Ryley私は自分のHTML(フォーム部分)を投稿しました。私の投稿の編集を確認してください。 :) – John

+0

あなたがバグを発見したと思います... – Ryley

答えて

5

は@Tats_innitはここにカスタムrequire_from_group投稿:https://stackoverflow.com/posts/13127475

が判明し、これはまたバージョンでリリースされたログインgithubのバグを修正しますrequire_from_groupの1.10.0がadditional-method-1.10.jsjquery.validationである。

githubの問題:彼はTats_innitの機能@再利用して、正しく動作し、他のルールに検証を無効にしない示したtestを作成した彼の溶液中でこのポスト引用し require_from_group disables other rules

smileyanpする@ githubのrequire_from_groupの前に定義されています。

この投稿は、このような小さな詳細はグーグルの3時間を燃やしたとして、時間の節約として、ここ..です

FIX:

だけadditional-method-1.10.jsを更新したりadditional-method-1.10.jsが読み込まれた後、このコードを実行します(関数を上書きする)。

jQuery.validator.addMethod("require_from_group", function(value, element, options) { 
    var numberRequired = options[0]; 
    var selector = options[1]; 
    var fields = $(selector, element.form); 
    var filled_fields = fields.filter(function() { 
    // it's more clear to compare with empty string 
    return $(this).val() != ""; 
    }); 
    var empty_fields = fields.not(filled_fields); 
    // we will mark only first empty field as invalid 
    if (filled_fields.length < numberRequired && empty_fields[0] == element) { 
    return false; 
    } 
    return true; 
// {0} below is the 0th item in the options field 
}, jQuery.format("Please fill out at least {0} of these fields.")); 
+0

この関数の1.11.1バージョンの動作をこの回答のバージョンと比較すると、このバージョンは出荷バージョンのように欲張りな再検証が行われていないようです。このバージョンはフォーム提出時に再検証されますが、最小数のフィールドに値があるとすぐに検証メッセージがクリアされます(onkeyup)。ユースケースのために欲張りな再検証が必要な人のためのちょうど参考です。 – jinglesthula

2

編集http://jqueryvalidation.org/

と参照用:

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.js 
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.min.js 
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/additional-methods.js 
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/additional-methods.min.js 
この修正は、バージョン1.12.0に組み込まれており、あなたがここにそれのためのCDNポインタを見つけることができるようにそれは実際に見えます

私は上記の解決策を見つける前にこのコードを見つけました。私の助言は、以下のコードをJSファイルに貼り付けるのではなく、上記のCDNリンクを使用することです。

ここにコピーしたbetter fix out on GitHub now(一番下までスクロール)があります。これは私の仕事ではありませんとそれを書いたGitHubのユーザーsfreytagはSOの貢献者ではないようですが、これを知っている他の人がスレッドを掘り起こす必要はありませんGitHubのは:

jQuery.validator.addMethod("require_from_group", function(value, element, options) { 
    var validator = this; 
    var selector = options[1]; 
    var validOrNot = $(selector, element.form).filter(function() { 
     return validator.elementValue(this); 
    }).length >= options[0]; 

    if(!$(element).data('being_validated')) { 
     var fields = $(selector, element.form); 
     fields.data('being_validated', true); 
     fields.valid(); 
     $(element.form).valid(); 
     fields.data('being_validated', false); 
    } 
    return validOrNot; 
}, jQuery.format("Please fill at least {0} of these fields.")); 

私はこれまでのところ、これに限定されたテストを行っているが、それはそう、あなたが期待するように、すべての検証が発生した(代わりに以前のように任意の非「require_from_group」検証吹き抜けるで)働いているように見えます私はこれまでこれまでに満足しています。私はちょうど私のJSコードの上にバリデータの宣言の後に追加しました:

$.validator.setDefaults({ 
    debug: true, 
    success: "valid" 
}); 

jQuery.validator.addMethod("require_from_group", function(value, element, options) { 
    var validator = this; 
    var selector = options[1]; 
    //continuation of code...