web-dev-qa-db-ja.com

jQuery UI開始日に基づいて範囲内の開始日と終了日を選択する

JQuery UIで日付ピッカーを作成しています。私がやろうとしているのは範囲を設定することです。したがって、最初の日付を選択すると、2番目の日付が表示され、30日間のウィンドウが表示されます。私はこれを試しましたが、うまくいきません(開始日から30日ではなく、今日から30日を選択できます):

var pickDate;
$( "#datepickerEnd" ).hide();
$( "#datepickerStart" ).datepicker();
$( "#datepickerStart" ).change(function(){
    var pickDate = $( "#datepickerStart" ).val();
    $( "#datepickerEnd" ).datepicker({ minDate: pickDate, maxDate: +30 });
    $( "#datepickerEnd" ).show();
})

私が遭遇した別の問題は、datepickerStartを変更すると、開始範囲が1回だけ設定されますが、変更するたびに設定されるわけではないということです。新しい開始日をロックするには、ページを更新する必要があります。

11
Matt Coady

これをチェックして jsfiddle ここに。それはあなたの問題の実例です。

[〜#〜] html [〜#〜]

<input type="text" id="dt1">
<input type="text" id="dt2">

[〜#〜] js [〜#〜]

$(document).ready(function () {
    $("#dt1").datepicker({
        dateFormat: "dd-M-yy",
        minDate: 0,
        onSelect: function () {
            var dt2 = $('#dt2');
            var startDate = $(this).datepicker('getDate');
            //add 30 days to selected date
            startDate.setDate(startDate.getDate() + 30);
            var minDate = $(this).datepicker('getDate');
            var dt2Date = dt2.datepicker('getDate');
            //difference in days. 86400 seconds in day, 1000 ms in second
            var dateDiff = (dt2Date - minDate)/(86400 * 1000);

            //dt2 not set or dt1 date is greater than dt2 date
            if (dt2Date == null || dateDiff < 0) {
                    dt2.datepicker('setDate', minDate);
            }
            //dt1 date is 30 days under dt2 date
            else if (dateDiff > 30){
                    dt2.datepicker('setDate', startDate);
            }
            //sets dt2 maxDate to the last day of 30 days window
            dt2.datepicker('option', 'maxDate', startDate);
            //first day which can be selected in dt2 is selected date in dt1
            dt2.datepicker('option', 'minDate', minDate);
        }
    });
    $('#dt2').datepicker({
        dateFormat: "dd-M-yy",
        minDate: 0
    });
});

Soderslattで既に述べたように、日付を設定するには onSelect オプションを使用します。私が使用した他の方法は次のとおりです。

それらはすべて自明であり、ドキュメントはそれらがどのように機能するかを理解するのに役立ちます。 2番目の日付ピッカーの日付をdt1の日付+ 1日に設定する場合は、次の行と同じ操作を行います。

startDate.setDate(startDate.getDate() + 30);

ただし、もちろん30日ではなく1日を追加します。

28
SirDerpington

.change()の代わりにui onSelectコールバックを使用してみてください http://api.jqueryui.com/datepicker/#option-onSelect

初期化時:

var $datepickerStart = $("#datepickerStart");
$datepickerStart.datepicker({
    onSelect: function( selectedDate ) {
        $datepickerStart.datepicker( "option", "minDate", selectedDate );
    }
});
2
anderssonola
$("#start_date").datepicker().on('changeDate', function(selected){
        startDate = new Date(selected.date.valueOf());
        $('#end_date').datepicker('setStartDate', startDate);
    });  

    $("#end_date").datepicker().on('changeDate', function(selected){
        startDate = new Date(selected.date.valueOf());
        $('#start_date').datepicker('setEndDate', startDate);
    });
1
Saurabh