13

我正在 jQuery ui 中构建一个日期选择器。我要做的是设置一个范围,所以当他们选择第一个日期时,第二个日期会出现并给出一个 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 时,它只会设置一次开始范围,而不是每次更改它时。我必须刷新页面才能锁定新的开始日期。

4

3 回答 3

35

在这里检查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选项来设置日期。我使用的其他方法是:

我认为它们都是不言自明的,文档可以帮助您了解它们的工作原理。如果要将第二个 datepicker 的日期设置为 dt1 的日期 + 1 天,请执行以下操作:

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

但是当然要加 1 天而不是 30 天。

于 2013-06-10T07:25:10.110 回答
2

尝试使用 ui onSelect 回调而不是 .change(),http: //api.jqueryui.com/datepicker/#option-onSelect

在初始化:

var $datepickerStart = $("#datepickerStart");
$datepickerStart.datepicker({
    onSelect: function( selectedDate ) {
        $datepickerStart.datepicker( "option", "minDate", selectedDate );
    }
});
于 2013-06-10T06:15:21.633 回答
2
$("#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);
    });
于 2018-11-23T10:19:21.853 回答