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

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

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

于 2011-01-07T20:12:21.860 回答