Там не должно быть необходимости в Ajax.Ajax перезванивает на сервер, но сервер не знает больше о действительных датах, чем клиент, поэтому все это можно сделать в javascript.Если вы уже используете jQuery, используйте плагин jQuery, но не загружайте всю библиотеку jQuery только для этого: это излишне.Есть много легких сборщиков даты.Все, что вы хотите сделать, это перезагрузить доступные дни, когда кто-то меняет месяц / год (помните февраль: вам нужно перезагрузить также и изменение года).
Мы сделали это с помощью метода, который включает в себя имядень недели вместе с датой:
function OnMonthYearChange(name) {
var week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var year = document.getElementById(name + '-year');
var mon = document.getElementById(name + '-mon');
var mday = document.getElementById(name + '-mday');
if ((mon.value == '') || (year.value == '')) {
return;
}
var date = new Date();
date.setYear(year.value);
date.setMonth(mon.value);
var l = getDaysInMonth(year.value, mon.value);
var day = mday.value;
clearSelect(mday);
var w = 0;
for (i = 0; i < l; i++) {
date.setFullYear(year.value, mon.value - 1, i + 1);
w = date.getDay();
var o = document.createElement('option');
o.value = getLeadingZero(i + 1);
o.text = o.value + ' - ' + week[w];
//alert(o.text);
if (i == (day - 1)) o.selected = true;
if (app.IsIE) {
mday.add(o);
} else {
mday.options.add(o);
}
}
}
function getDaysInMonth(year, month) {
var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (month != 2) return m[month - 1];
if (year % 4 != 0) return m[1];
if (year % 100 == 0 && year % 400 != 0) return m[1];
return m[1] + 1;
}
function clearSelect(e) {
var first = e.options[0].innerHTML;
if (first) {
// Form does not allow selection of a blank date. Drop all existing options.
e.options.length = 0;
} else {
// Form allows selection of a blank date. First option is blank. Keep it.
e.options.length = 1;
}
}
function getLeadingZero(n) {
if (n < 10) n = '0' + n;
return n;
}
См. http://www.mattkruse.com/javascript/calendarpopup/ для другого подхода, который открывает календарь.Их можно интегрировать, передавая результаты из всплывающего календаря обратно в блоки выбора.
Помните, что люди могут отключить JavaScript и делать всякие странные вещи на стороне клиента, поэтому проверка на стороне сервера по-прежнемувопросы.