HTML:

<select name='day' id='day'> <option selected='selected' disabled='disabled'>День</option> <?php for($day = 1; $day <= 31; $day++){ echo "<option value=\"". $day ."\">$day</option>\n"; } ?> </select> <select name='month' id='month'> <option selected='selected' disabled='disabled'>Месяц</option> <?php for($month = 1; $month <= 12; $month++){ switch($month){ case 1: $month_name = "января"; break; case 2: $month_name = "февраля"; break; case 3: $month_name = "марта"; break; case 4: $month_name = "апреля"; break; case 5: $month_name = "мая"; break; case 6: $month_name = "июня"; break; case 7: $month_name = "июля"; break; case 8: $month_name = "августа"; break; case 9: $month_name = "сентября"; break; case 10: $month_name = "октября"; break; case 11: $month_name = "ноября"; break; case 12: $month_name = "декабря"; } echo "<option value=\"". $month."\"> $month_name</option>\n"; }?> </select> <select name='year' id='year'> <option selected='selected' disabled='disabled'>Год</option> <?php for($year = date("Y") - 80; $year <= date("Y"); $year++){ echo "<option value=\"". $year ."\">$year</option>\n";}?> </select> 

Js:

 $("#year").change = $("#month").change(function(){ var year = document.getElementById('year').value, month = document.getElementById('month').value, md = (new Date(year, month, 0, 0, 0, 0, 0)).getDate(); var select = document.getElementById('day'); select.options.length = 0; for (var i = 1; i <= md; i++){ var option = document.createElement('OPTION'); option.innerHTML = option.value = i; select.appendChild(option); } }); 

Actually, how to make, that there was a leap year accounting when choosing a month and a year?

  • one
    This suggests an option - when the user changes the year or month, recreate select with the desired list of days. For all months except February, you can take the number of days from a fixed array, for February, calculate relative to the selected year - days = (((year% 4 == 0) && (year% 100! = 0)) || (year% 400 == 0))? 29: 28; - Vladimir Gamalyan
  • Doesn't your code take into account now? - Grundy

1 answer 1

In general, your code is quite working. There is no way to check the original php version, so here is the js-only rewritten implementation:

 <!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> </head> <body> <select name='day' id='day'> <option selected='selected' disabled='disabled'>День</option> </select> <select name='month' id='month'> <option selected='selected' disabled='disabled' value='0'>Месяц</option> <option value="1">января</option> <option value="2">февраля</option> <option value="3">марта</option> <option value="4">мая</option> <option value="5">июня</option> <option value="6">июля</option> <option value="7">августа</option> <option value="8">сентября</option> <option value="9">октября</option> <option value="10">февраля</option> <option value="11">ноября</option> <option value="12">декабря</option> </select> <select name='year' id='year'> <option selected='selected' disabled='disabled' value='0'>Год</option> <option value="2015">2015</option> <option value="2016">2016</option> <option value="2017">2017</option> <option value="2018">2018</option> <option value="2019">2019</option> <option value="2020">2020</option> <option value="2021">2021</option> </select> <script> var updateDays = function() { var year = document.getElementById('year').value || 2015, month = document.getElementById('month').value || 1, md = new Date(year, month, 0).getDate(); var select = document.getElementById('day'); select.options.length = 1; for (var i = 1; i <= md; i++) { var option = document.createElement('OPTION'); option.innerHTML = option.value = i; select.appendChild(option); } }; updateDays(); $("#month").change(updateDays); $("#year").change(updateDays); </script> </body> </html> 

Perhaps your script has fallen due to the fact that a year or a month was not selected at the time of calculating the number of days. For fixes added values ​​for default options.