jquery-ui datepicker: зеркальное отображение нескольких полей ввода - PullRequest
2 голосов
/ 24 марта 2012

У меня есть 2 набора полей ввода:

1) «Дата начала I» и «Дата окончания I»

2) «Дата начала II» и «Дата окончания II»

как можно увидеть здесь: http://jsfiddle.net/YXzpj/

Мне нужно, чтобы каждый раз, когда пользователь устанавливал начальную и конечную даты одной стороны, выбранные значения копировались на другую сторону.

Например: Пользователь устанавливает «Начальная дата I», а затем «Конечная дата I», после чего сценарий должен автоматически скопировать оба значения в «Начальную дату II» и «Конечную дату II». Если пользователь изменяет любое из четырех полей, форма должна соответствующим образом обновиться. Другими словами, эти два набора полей ввода должны отражать друг друга.

Вот мой текущий код:

$(function() {

    var currentTime = new Date();


    $('#report2from1').attr('readonly','readonly');
    $('#report2to1').attr('readonly','readonly');    
    var dates1 = $( "#report2from1, #report2to1" ).datepicker({
        showButtonPanel: true,            
        changeMonth: true,
        changeYear: true,
        numberOfMonths: 1,
        minDate: new Date(2010, 1 -1, 1),
        maxDate: new Date(currentTime.getFullYear(), 11, 31),
        dateFormat: "yy/mm/dd",
        onSelect: function( selectedDate ) {
            var option = this.id == "report2from1" ? "minDate" : "maxDate",
                instance = $( this ).data( "datepicker" ),
                date = $.datepicker.parseDate(
                    instance.settings.dateFormat ||
                    $.datepicker._defaults.dateFormat,
                    selectedDate, instance.settings );
            dates1.not( this ).datepicker( "option", option, date );
            if ( this.id == "report2from1" ){
                dates1.not( this ).datepicker( "setDate", date );
            }
        }
    });    

    $('#report2from2').attr('readonly','readonly');
    $('#report2to2').attr('readonly','readonly');
    var dates2 = $( "#report2from2, #report2to2" ).datepicker({
        showButtonPanel: true,    
        changeMonth: true,
        changeYear: true,
        numberOfMonths: 1,
        minDate: new Date(2010, 1 -1, 1),
        maxDate: new Date(currentTime.getFullYear(), 11, 31),
        dateFormat: "yy/mm/dd",
        onSelect: function( selectedDate ) {
            var option = this.id == "report2from2" ? "minDate" : "maxDate",
                instance = $( this ).data( "datepicker" ),
                date = $.datepicker.parseDate(
                    instance.settings.dateFormat ||
                    $.datepicker._defaults.dateFormat,
                    selectedDate, instance.settings );
            dates2.not( this ).datepicker( "option", option, date );
            if ( this.id == "report2from2" ){
                dates2.not( this ).datepicker( "setDate", date );
            }                
        }
    });


});

1 Ответ

2 голосов
/ 24 марта 2012

Плагин Datepicker имеет возможность автоматически делать то, что вы ищете: altField

altField
Селектор, jQuery, ElementDefault: ''
Селектор jQuery для другого поля, которое должно быть обновлено выбранной датой из средства выбора даты. Используйте параметр altFormat, чтобы изменить формат даты в этом поле. Оставьте пустым, чтобы не было альтернативного поля.

Вот как я бы оптимизировал ваш код:

$(function() {

    var currentTime = new Date(),
        // cache your selection already
        $dateFields = $('#report2from1, #report2to1, #report2from2, #report2to2');

    // set all fields to readonly
    $dateFields.attr('readonly', 'readonly');

    // the options are the same for all instances
    var options = {
        showButtonPanel: true,
        changeMonth: true,
        changeYear: true,
        numberOfMonths: 1,
        minDate: new Date(2010, 1 - 1, 1),
        maxDate: new Date(currentTime.getFullYear(), 11, 31),
        dateFormat: "yy/mm/dd",
        // set the date on open so the populated date is selected in the widget
        beforeShow: function(input, instance) {
            $(input).datepicker('setDate', $(input).val());
        }
    };

    // instanciate datepicker with the options for all the fields
    $dateFields.datepicker(options);

    // apply separately the option 'altField' accordingly
    $('#report2from1').datepicker('option', 'altField', '#report2from2');
    $('#report2from2').datepicker('option', 'altField', '#report2from1');
    $('#report2to1').datepicker('option', 'altField', '#report2to2');
    $('#report2to2').datepicker('option', 'altField', '#report2to1');

});​

DEMO

...