Повторное заполнение дат в полях выбора - PullRequest
6 голосов
/ 28 января 2011

Я создал date_select в Rails (это 3 поля выбора: одно для года, одно для месяца и одно для дня).

Иметь 31 февраля на них довольно странно. То, что я хочу иметь - это иметь поля выбора только с действительными датами. Я имею в виду, что когда вы выбираете 31, 30, (и в некоторые годы 29), удаляются, затем, когда вы выбираете январь, они снова добавляются и так далее. Кроме того, я хочу, чтобы начальные поля выбора заполнялись только днями выбранного месяца.

Ответы [ 2 ]

9 голосов
/ 28 января 2011

Я предполагаю, что у вас есть три выбора с классами 'day', 'month', 'year'. Тогда используйте этот JS:

function monthChanged() {
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    var month = $('.month').val() - 1, year = +$('.year').val();
    var diff;

    // Check for leap year if Feb
    if (month == 1 && new Date(year, month, 29).getMonth() == 1) days[1]++;

    // Add/Remove options
    diff = $('.day option').length - (days[month] + 1);
    if (diff > 0) { // Remove
        $('.day option').slice(days[month] + 1).remove();
    } else if (diff < 0) { // Add
        for (var i = $('.day option').length; i <= days[month]; i++) {
            $('<option>').attr('value', i).text(i).appendTo('.day');
        }
    }
}

$(function () {
    monthChanged(); // On document ready
    $('.month').change(monthChanged); // On month change
    $('.year').change(monthChanged); // On year change (for leap years)
});

Демо: http://jsfiddle.net/FxBpB/

1 голос
/ 20 июня 2018
/* automatically update days based on month */

for (var i = 2014; i < 2019; i++) {
    $('<option>').attr('value', i).text(i).appendTo('#start_year');
}

function monthChanged() {
    debugger;
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    var month = $('#start_month').val() - 1,
        year = +$('#start_year').val();

    // Check for leap year if Feb
    if (month == 1 && new Date(year, month, 29).getMonth() == 1) 
        days[1]++;

    // Add/Remove options
    if ($('#start_day option').length > days[month]) {
        // Remove
        $('#start_day option').slice(days[month] + 1).remove();
    } else if ($('#start_day option').length < days[month] + 1) {
        // Add
        for (var i = $('#start_day option').length + 1; i <= days[month]; i++) {
            $('<option>').attr('value', i).text(i).appendTo('#start_day');
        }
    }
}


monthChanged(); // On document ready
$('#start_month').change(monthChanged); // On month change
$('#start_year').change(monthChanged); // On year change (for leap years)

Ссылка на скриптовую ссылку: http://jsfiddle.net/u3fr1mt0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...