Это на самом деле открытый вопрос с jQuery UI Datepicker . Вот билет на выпуск:
Билет 8159
В основе этой проблемы лежит тот факт, что Datepicker неправильно обрабатывает defaultDate значение null . Из предложенных здесь решений мне нравится j-polfer лучшее, и поэтому я проголосовал за него. Однако это решение работает по той причине, что в метод setDate встроен патч для очистки выбора, если null передается в параметр даты. Но я хотел выяснить , почему Datepicker не отвечал правильно на defaultDate: null в опциях, и поэтому я взглянул на источник.
Я обнаружил, что мне нужно внести три изменения в исходный код Datepicker , чтобы решить эту проблему. Вот изменения, которые я сделал:
- Метод _getDefaultDate вернул текущую дату, когда параметр defaultDate был нулевым или отсутствовал (это суть проблемы).
Я изменил этот метод из этого ...
_getDefaultDate: function(inst) {
return this._restrictMinMax(inst,this._determineDate(inst,this._get(inst, "defaultDate"), new Date()));
}
к этому ....
_getDefaultDate: function(inst) {
var def = this._get(inst, "defaultDate");
return def !== null ? this._restrictMinMax(inst, this._determineDate(inst, def , new Date())): null;
},
- Метод _setDate устанавливал выбранный день на текущий день, когда значение null было передано в параметр даты. Я изменил строки, чтобы исправить это:
Я изменил эту строку ...
inst.selectedDay = inst.currentDay = newDate.getDate();
к ...
inst.selectedDay = date == null? 0: inst.currentDay = newDate.getDate();
и эта строка ...
this._adjustInstDate(inst);
к ...
if (date != null) {
this._adjustInstDate(inst);
}
- Наконец, метод _generateHTML не обработал возвращаемое значение NULL из _getDefaultDate .
Итак, я изменил эту строку ...
(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
к ...
(defaultDate != null && (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime())) ?
Вот и все. Теперь опция Datepicker defaultDate более интуитивно реагирует на передаваемое значение null или на отсутствие этой опции.
$('#test').datepicker({ altField: '#alt'}); // No date selected
$('#test').datepicker({ altField: '#alt', defaultDate: null}); // No date selected
$('#test').datepicker({ altField: '#alt', defaultDate: 0}); // Today selected
$('#test').datepicker({ altField: '#alt', defaultDate: +1}); // Tomorrow selected
$('#test').datepicker({ altField: '#alt', defaultDate: -1}); // Yesterday selected
Вот демоверсия в JSFIDDLE : Демо Datepicker с defaultDate null
Обратите внимание: Эти изменения не были полностью протестированы, поэтому могут возникнуть другие проблемы, связанные с тем, что метод _getDefaultDate теперь может возвращать ноль. Поэтому сначала проведите собственное тестирование! ;)
Надеюсь, это кому-нибудь поможет! :)