2010-09-21 124 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即可接受日期而不是字段,并编写一个包装规则来接受一组日期对。

如果您已找到问题的解决方案,我很乐意看到它。希望它会比我更优雅。