Здесь мой месяц выбирает вариант HTML:
<select id="cmbMonth" style="margin-right:20px;">
<option value="--" selected="selected">--</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
Вариант выбора дня HTML:
<select id="cmbDay" style="margin-right:20px;">
<option value="--" selected="selected">--</option>
</select>
Вот мой jQuery для управления YEAR, MONTH и DATE:
//Get Year, Month, and Day
function daysInMonth(month,year) {
var dd = new Date(year, month, 0);
return dd.getDate();
}
function setDayDrop(dyear, dmonth, dday) {
var year = dyear.options[dyear.selectedIndex].value;
var month = dmonth.options[dmonth.selectedIndex].value;
var day = dday.options[dday.selectedIndex].value;
if (day == '--') {
var days = (year == '--' || month == '--')
? 31 : daysInMonth(month,year);
dday.options.length = 0;
dday.options[dday.options.length] = new Option('--','--');
for (var i = 1; i <= days; i++)
dday.options[dday.options.length] = new Option(i,i);
}
}
function setDay() {
var year = document.getElementById('cmbYear');
var month = document.getElementById('cmbMonth');
var day = document.getElementById('cmbDay');
setDayDrop(year,month,day);
}
$('#cmbMonth').change(function() {
setDay();
});
Этот код отлично работает для обновления cmbDay, когда месяц изменяется в стадии предварительной загрузки.
Проблема заключается в том, что пользователь выбирает день и меняет месяц, параметр дня не обновляется и сохраняется в предыдущий месяц.
Я думаю, это потому, что вы изменили значения только тогда, когда ваш день "-". но когда он уже присутствует, это условие терпит неудачу и выполнить нечего.
if (day == '--') // for first time
{
// code to generate days for the selected month
}
else // when day is already present
{
// code to generate days for the selected month
}
Работает для меня, если я удаляю if, перезагружаю день и добавляю изменения к году и месяцу
function setDayDrop(dyear, dmonth, dday) {
var year = dyear.options[dyear.selectedIndex].value;
var month = dmonth.options[dmonth.selectedIndex].value;
var days = (year == '--' || month == '--') ? 31 : daysInMonth(month, year);
dday.options.length = 1; // no need to set this to 0 each time
for (var i = 1; i <= days; i++) {
dday.options[dday.options.length] = new Option(i, i);
}
}
function setDay() {
var year = document.getElementById('cmbYear');
var month = document.getElementById('cmbMonth');
var day = document.getElementById('cmbDay');
// optional
// day.selectedIndex=0;
setDayDrop(year, month, day);
}
$(function () {
$('#cmbMonth, #cmbYear').change(function () {
setDay();
});
});