1

私はjQuery.datepickerとjQuery.validateを使用しています。私のフォームには、複数の日付範囲があります。

2010-02-10 - 2010-02-18
2010-03-01 - 2010-03-12
2010-03-15 - 2010-03-19

次に、datepickerフィールドを検証して、datepickerに設定された日付がこれらの日付範囲のいずれかにあるかどうかを確認する必要があります。たとえば、2010-01-01は、2010-02-19と同様に無効になります。

私は多くの答えを見てきましたが、私が見る限り、それらは実際には複数の範囲に関連していません。

誰かが私を正しい方向に導くための解決策または少なくとも指針を知っていますか?.each()で各日付範囲をループし、そこで検証を実行することを考えています。しかし、おそらくもっと良い方法があります。

4

1 に答える 1

1

あなたの質問は、私もしばらく理解しようとしてきたものです。これは私がこれまでに持っているものです。

これを使用して、単一の日付範囲を検証します。入力フィールドを日付ではなくパラメーターとして受け取ります。

jQuery.validator.addMethod("rangeDate", function(value, element, params) {
    try {
        var beforedate=$.datepicker.parseDate($(params[0]).datepicker('option','dateFormat'),$(params[0]).val());
        var afterdate=$.datepicker.parseDate($(params[1]).datepicker('option','dateFormat'),$(params[1]).val());
        var qdate=$.datepicker.parseDate($(element).datepicker('option','dateFormat'),value);
        return this.optional(element) || (qdate >= beforedate && qdate<=afterdate);
    } catch(err){
        return false;
    }
}, function(params){
    return "Date must occur between " + $(params[0]).val() + ' and ' + $(params[1]).val();
}
);

ルールは次のようになります。

rules:{
  between_date: { dateCan: true, 
         rangeDate:  {
            depends: function(element) { //check that params exist
                return $("input[name='before_date']").valid()
                       && $("input[name='after_date']").valid();
            },
            param:  ["input[name='before_date']", "input[name='after_date']"]
         }
  }
}

rangeDate少し実験した後、1 つのフィールドに複数のルールを設定できることがわかりました。ただし、最後の呼び出しrangeDateは、そのフィールドに対する以前のすべての呼び出しの結果を上書きするように見えます。したがって、フィードできるフィールドのペアの配列を受け入れる別のカスタムルールを追加することがうまくいくと思いますrangeDate。このアプローチの問題は、より多くの日付のペアを取得するにつれてdepends、ルールの句が扱いにくくなることです。rangeDateこれは、すべてのペアではなく少なくとも 1 つのペアのみが必要な場合に特に当てはまります。

もちろん、日付範囲が動的でない場合は、depends句が必要ないため、問題はより簡単になります。rangeDateフィールドではなく日付を受け入れるように書き直して、日付のペアの配列を受け入れるようにラッパー ルールを記述します。

問題の解決策が見つかった場合は、ぜひご覧ください。うまくいけば、それは私のものよりもエレガントになります。

于 2011-01-07T20:12:21.860 に答える