验证jQuery.validate和datepicker中多个日期之间的日期

时间:2010-09-21 02:27:11

标签: jquery jquery-validate jquery-ui-datepicker date-range

我正在使用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()中循环每个日期范围并在那里运行验证。但可能有更好的方法。

1 个答案:

答案 0 :(得分: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规则。但是,最后一次调用似乎会覆盖该字段的所有先前rangeDate次调用的结果。所以我认为可能有用的是添加另一个自定义规则,该规则接受可以馈送到rangeDate的一组字段对。这种方法的问题在于,depends规则的rangeDate子句变得难以处理,因为您获得了更多的日期对。如果您只需要至少一对而不是所有对,则尤其如此。

当然,如果日期范围不是动态的,则问题更容易,因为不需要depends子句。只需重写rangeDate以接受日期而不是字段,并编写包装规则以接受一组日期对。

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