Элемент управления datepicker в jQuery UI с функцией beforeShowDay


Я относительно новым для JavaScript и jQuery. Я хотел отмечать, что имеет следующие функциональные возможности:

  1. Выходные не выбирается
  2. Нерабочие дни (праздничные дни и т. д.) не выбирается
  3. Первый выбор должен быть день Х количество полных рабочих дней в будущем, принимая во внимание праздничные и выходные дни

Я посмотрел несколько примеров и придумал этот (формат даты: ДД/ММ):

$(function() {

  var holidays= [[3,1], [22,4], [25,4], [29,4], [2,5], [30,5], [29,8], [26,12], [27,12]];

  var workingDayOffset = 10, selectedDate = new Date();

  function nonWorkingDays(date) {
    for (var j = 0; j < holidays.length; j++) {
      if (date.getMonth() == holidays[j][1] - 1 && date.getDate() == holidays[j][0]) {
        return [false, ''];
      }
    }
  return [true, ''];
  }

  function beforeCurrentDate(date) {  
   if(date.getDate() === selectedDate.getDate() && date.getMonth() === selectedDate.getMonth() && date.getFullYear() === selectedDate.getFullYear())
   {
    return [true, ''];
   }   
   return [date < selectedDate,'']; 
  }

  function nonAvailableDays(date) {
    var noWeekend = $.datepicker.noWeekends(date), before = beforeCurrentDate(date), holiday = nonWorkingDays(date);        
    return [noWeekend[0] && before[0] && holiday[0], ''];
  }

  for(var i = 0; i < workingDayOffset; i++) {
    selectedDate.setDate(selectedDate.getDate() + 1);
    if(!nonAvailableDays(selectedDate)[0])
    { 
      i--;
    }    
  }

  Date.prototype.formatDDMMYY=function(){
    var dd = this.getDate(), mm = this.getMonth()+1, yyyy = this.getFullYear();
    if(dd<10){
      dd = '0' + dd;
    }    
    if(mm<10){
      mm = '0'+ mm;
    }
  return String(dd + "\/" + mm + "\/" + yyyy);
  };

  $( "#datepicker" ).val(selectedDate.formatDDMMYY());

  $( "#datepicker" ).datepicker({ beforeShowDay: nonAvailableDays, dateFormat: 'dd/mm/yy', showOn: 'button', buttonText: "select", defaultDate: selectedDate,gotoCurrent: true}) ;   
});

Я ищу общие критика кода, но есть несколько вещей, которые я думал, будет легче / чище:

  1. В beforeCurrentDate я хочу проверить, что дата была меньше значения свойства selecteddate, с точки зрения всего дня, не включая компонент времени. Используя дата > значения свойства selecteddate вернется значение false, даже если дата компонент был таким же, за счет времени части. Я думал о том, как установить время на выбранную дату, но тогда смещение GMT вступил в игру. Мне казалось, что это должно быть проще, в конце я добавил, что выдумки проверить только дату компоненты на матч.

  2. Я не уверен, уточнив дату.прототип.formatDDMMYY - это правильный путь. Опять же, это чувствовал, что это должно быть более прямолинейным.

Мне интересно услышать ваши мысли по этому поводу.



15344
7
задан 25 марта 2011 в 03:03 Источник Поделиться
Комментарии
1 ответ

для 1)

var today = new Date();
today.setTime(0); // resets the time. (midnight)

Я считаю, что это будет исправить дату сравнения

для 2)

Просто это хреново, что там не встроенный для такого рода вещи. Я бы предложил не поставив его на дату прототип только в случае, если она конфликтует с какой-то другой функции даты/библиотека вниз по дороге. Его, кажется, лишь вопрос предпочтений.

(если вас Google: на JavaScript формат даты вы увидите много других примеров форматирования даты или https://stackoverflow.com/q/1056728/684890 где есть несколько альтернатив, предложенных в случае, если вы хотите, чтобы некоторые дополнительные функциональные возможности. )

2
ответ дан 27 июня 2011 в 03:06 Источник Поделиться