2011-09-12 13 views
2

私は、検証されたフィールドが空でない場合(またはその逆の場合)にのみ別のフィールドが必要であることを検証する控えめな検証ツールを作成している状況があります。問題は、他のフィールドが再検証されないエッジケースがいくつかあり、無限ループを起こさずに再検証するようにしたいということです。無限ループを発生させずに他のフィールドを検証する

私の検証方法は、次のようになります。

$.validator.addMethod("jqiprequired", function (value, element, params) { 
    if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
     return true; 
    } 

    return false; 
}); 

paramsが私の他のフィールド(両方のテキストボックスある)です。両方が空の場合は通過し、両方の値がある場合は通過します。 1つだけに値がある場合にのみ失敗します。

これは、1つのフィールドが空で、別のフィールドに値がある場合、そのフィールドから値を削除し、空のフィールドは再検証されません(値は変更されていないため)。

私はこれやってみました:

if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
    $('form').validate().element(params); 
    return true; 
} 

をしかし、それが通過するたびに、それは他を呼び出すので、これは無限ループが発生します。

元のフィールドを呼び出すことなく、他のフィールドを検証するにはどうすればよいですか?

答えて

1

各フィールドに属性を追加する代わりに、この検証方法を追加するスクリプトに変数jqip_validatingを追加してみてください。すると、次のようにあなたの検証を変更します。

var jqip_calledFromOtherValidator = false; 
if (jqip_validating) { 
    jqip_validating = false; 
    jqip_calledFromOtherValidator = true; 
} 
if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
    if (!jqip_validating && !jqip_calledFromOtherValidator) { 
     jqip_validating = true; 
     $('form').validate().element(params); 
    } 
    return true; 
} 

と呼ばれる他のバリためには、両方の条件を満たさなければならない、と最初のバリデータが二バリデータを呼び出すとき、彼らは唯一満足させることができます。

0

各フィールドにis_validating属性を追加して、検証がスキップされた場合はそれをtrueに設定し、検証してからクリアすることができます。

+0

ええ、私はそれを試みました。結果は奇妙でした。それはうまくいきましたが、検証は全面的に行われ、停止する前に20〜30回検証されることもありました。 '.validate()'呼び出しがフォーム全体を再度検証していたようです。 –

関連する問題