2010-09-21 145 views
1

我正在使用jQuery.datepicker和jQuery.validate。 在我的表單中我有多個日期範圍:在jQuery.validate和datepicker中的多個日期之間驗證日期

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

現在我需要驗證日期選擇現場檢查的日期選擇器設置的日期是任何的日期範圍之間。例如2010-01-01將與2010-02-19一樣無效。

我已經看到了一些答案,但他們並沒有真正涉及到多個範圍,據我所見。

希望任何人都知道一個解決方案,或者至少可以暗示我在正確的方向。 我想也許循環每個日期範圍在一個.each()並在那裏運行驗證。但可能有更好的方法。

+0

你明白了嗎? – Silkster 2010-10-15 14:41:44

+0

不怕,自從發佈這個問題以來,我沒有時間再研究它。但這絕對是我需要儘快弄清楚的事情。 – amunds 2010-10-17 08:38:28

+0

這些值是硬編碼到窗體還是改變?如果是這樣,我可能有一個解決方案。 – 2010-10-25 04:07:38

回答

1

你的問題是我一直想弄明白的。這是我迄今爲止所擁有的。

我用它來驗證單個日期範圍。它需要輸入領域PARAMS而非日期:

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規則爲一個領域。但是,最後一次調用似乎會覆蓋該字段以前所有rangeDate調用的結果。所以我認爲什麼可能工作是添加另一個自定義規則,接受一對字段的數組可以被送到rangeDate。這種方法的問題在於,rangeDate規則的depends子句變得笨重,因爲您獲得更多日期對。如果你只需要至少有一對在場,而不是所有對,那就更是如此。

當然,如果日期範圍不是動態的,問題是比較容易,因爲沒有depends條款是必要的。只需重寫rangeDate即可接受日期而不是字段,並編寫一個包裝規則來接受一組日期對。

如果您已找到問題的解決方案,我很樂意看到它。希望它會比我更優雅。