jQuery UI日期选择器-以最小/最大日期排除禁用日期



我正在使用jQuery UI日期选择器,并在beforeShowDay上使用noWeekends方法来禁用周末选项。结合这一点,我想设置一个从今天起5天和-5天的最短和最长日期。

不过,我的问题是,我不希望周末被包括在这5天的时间里。我希望它是一个最小和最大5天可选择的日子,而不是一般的日子。我只希望在最小和最大日期范围内计算未禁用的日期。

示例:如果在过去的45天内有2天是残疾的,那么45天的正念实际上是47天(如果包括残疾日期)。

http://jsfiddle.net/corydorning/8mp5W/

// what I need
$('.date').datepicker({
    maxDate: 5, // 5 selectable days
    minDate: -5, // -5 selectable days
    beforeShowDay: $.datepicker.noWeekends
});

注意:我正在寻找一个解决方案,考虑任何禁用日期,而不仅仅是周末。我只是在这个例子中使用了周末,因为它是最容易表示的,并且内置于jQueryUI中。

编辑beforeShowDay函数,如下所示:

$('.date').datepicker({
    maxDate: 5,
    minDate: -5,
    beforeShowDay: function (date) {
        var day = date.getDay();
        //disable Tuesdays
        return [(day != 2), ""];
    }
});

请在此处查看小提琴:http://jsfiddle.net/8mp5W/1/

使用这种模式,您应该能够创建一个不想显示的日期列表(而不是只显示周二等)。

我认为这回答了你关于如何获得自定义可用日期的能力的问题。

编辑

以下javascript通过从今天的日期向后计数并在运行计数时跳过周末日期[0,6]来设置minDate。当它达到你想要的天数时就会停止。

它可以变得更高效,并且应该参数化,等等,但我将把调优和定制留给您。查找maxDate将以同样的方式工作,但将日期提前。

$(window).load(function(){
  $('.date').datepicker({
    minDate: findMin (),
    beforeShowDay: $.datepicker.noWeekends
  });
});

function findMin () {
        var today = new Date();
        var invalidWeekdays = [0,6]; //weekdays to disregard
        var validDaysPrior = 5; //number of days to count back
        var i = 0;
        while (i < validDaysPrior) {
           today.setDate(today.getDate()-1); //decrement day
           console.log("today is", today);
           var todayWeekday = today.getDay();
           if ( jQuery.inArray(todayWeekday, invalidWeekdays) < 0 ) {
               console.log(todayWeekday + " is valid");
               i++;
           } else {
               console.log(todayWeekday + " is NOT valid");
           }
        }
        console.log(validDaysPrior + " valid days ago occurred on " + today);
        return today;
}

您可以尝试以下代码:get_date()在我的代码中通过ajax进行调用。您可以创建一个数组。并在那里输入日期。

window.natDays = [];
$.ajax({
  type : "POST",
  async : false,
  url : rootPath + '/get_date',
  data : "ajax=true",
  success : function(msg) {
    var a = $.parseJSON(msg);
    $i = 0;
    $.each(a, function(key, value) {
      arr = (value.Date['date']).split('-');
      arr2[key] = new Array(value.Date['month'], arr[2],
          value.Date['occassion']);
    });
    natDays = arr2;
  }
});
var dateMaxforswitch = new Date();
dateMinforswitch.setDate(dateMinforswitch.getDate()
    + (dateMinforswitch.getHours() >= 17 ? 1 : 0));
dateMaxforswitch.setDate(dateMaxforswitch.getDate()
    + (dateMaxforswitch.getHours() >= 17 ? 1 : 0));
AddBusinessDays(dateMaxforswitch, 25);
function AddBusinessDays(curdate, weekDaysToAdd) {
  while (weekDaysToAdd > 0) {
    curdate.setDate(curdate.getDate() + 1);
    // check if current day is business day
    if (noWeekendsOrHolidays(curdate)[0]) {
      weekDaysToAdd--;
    }
  }
}
function noWeekendsOrHolidays(date) {
  var noWeekend = $.datepicker.noWeekends(date);
  if (noWeekend[0]) {
    return nationalDays(date);
  } else {
    return noWeekend;
  }
}
function nationalDays(date) {
  for (i = 0; i < natDays.length; i++) {// alert(natDays[i][2]);
    if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
      return [ false, natDays[i][2] + '_day' ];
    }
  }
  return [ true, '' ];
}

最新更新