jQuery datepicker- 2个输入/文本框和限制范围

时间:2008-12-01 12:49:38

标签: jquery jquery-plugins datepicker jquery-ui-datepicker

我正在使用带有两个输入框的jQuery Datepicker小部件,一个用于“From”日期,第二个用于“To”日期。我使用jQuery Datepicker functional demo作为使两个输入框相互协作的基础,但我需要能够添加这些额外的限制:

  1. 日期范围不能早于 2008年12月1日

  2. “至”日期可以是否定的     晚于今天

  3. 一旦“来自”日期     如果选中,“至”日期只能     在7天之内     “来自”日期

  4. 如果“至”日期为     首先选择,然后选择“From”日期     只能在7的范围内     在“To”日期之前的几天(使用     12月1日的限制是第一次     

  5. 我似乎无法完成上述所有工作。

    总之,我希望能够在12月1日到今天之间选择最多7天的续航时间(我意识到我将在12月1日发布此内容,因此暂时只能在今天发布)。

    到目前为止我的代码

    $(function () {
    
    $('#txtStartDate, #txtEndDate').datepicker(
                {
                showOn: "both",
                beforeShow: customRange,
                dateFormat: "dd M yy",
                firstDay: 1, 
                changeFirstDay: false
                });
    });
    
    function customRange(input) 
    { 
    
    return {
             minDate: (input.id == "txtStartDate" ? new Date(2008, 12 - 1, 1) : null),
             minDate: (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate") : null), 
             maxDate: (input.id == "txtStartDate" ? $("#txtEndDate").datepicker("getDate") : null)
           }; 
    }
    

    我错过了7天的范围限制,并且还在2008年12月1日之前或今天之后阻止“To”日期选择。任何帮助将不胜感激,谢谢。

8 个答案:

答案 0 :(得分:49)

非常感谢你的帮助Ben,我已经建立了你的帖子,并提出了这个。它现在已经完成并且运行得非常出色!

这是 Working Demo 。将 / edit 添加到网址以查看代码

以下完整代码 -

$(function () 
{   
    $('#txtStartDate, #txtEndDate').datepicker({
        showOn: "both",
        beforeShow: customRange,
        dateFormat: "dd M yy",
        firstDay: 1, 
        changeFirstDay: false
    });

});

function customRange(input) { 
    var min = new Date(2008, 11 - 1, 1), //Set this to your absolute minimum date
        dateMin = min,
        dateMax = null,
        dayRange = 6; // Set this to the range of days you want to restrict to

    if (input.id === "txtStartDate") {
        if ($("#txtEndDate").datepicker("getDate") != null) {
            dateMax = $("#txtEndDate").datepicker("getDate");
            dateMin = $("#txtEndDate").datepicker("getDate");
            dateMin.setDate(dateMin.getDate() - dayRange);
            if (dateMin < min) {
                dateMin = min;
            }
        }
        else {
            dateMax = new Date; //Set this to your absolute maximum date
        }                      
    }
    else if (input.id === "txtEndDate") {
        dateMax = new Date; //Set this to your absolute maximum date
        if ($("#txtStartDate").datepicker("getDate") != null) {
            dateMin = $("#txtStartDate").datepicker("getDate");
            var rangeMax = new Date(dateMin.getFullYear(), dateMin.getMonth(),dateMin.getDate() + dayRange);

            if(rangeMax < dateMax) {
                dateMax = rangeMax; 
            }
        }
    }
    return {
        minDate: dateMin, 
        maxDate: dateMax
    };     
}

答案 1 :(得分:14)

好吧,怎么样:

function customRange(input) 
{ 
    var min = new Date(2008, 12 - 1, 1);
    var dateMin = min;
    var dateMax = null;

    if (input.id == "txtStartDate" && $("#txtEndDate").datepicker("getDate") != null)
    {
        dateMax = $("#txtEndDate").datepicker("getDate");
        dateMin = $("#txtEndDate").datepicker("getDate");
        dateMin.setDate(dateMin.getDate() - 7);
        if (dateMin < min)
        {
            dateMin = min;
        }           
    }
    else if (input.id == "txtEndDate")
    {
        dateMax = new Date();
        if ($("#txtStartDate").datepicker("getDate") != null)
        {
            dateMin = $("#txtStartDate").datepicker("getDate");
            dateMax = $("#txtStartDate").datepicker("getDate");
            dateMax.setDate(dateMax.getDate() + 7); 
        }
    }
    return {
     minDate: dateMin, 
     maxDate: dateMax
   }; 

}

这是我能想到的最符合你所有要求的(我认为......)

答案 2 :(得分:14)

我意识到我有点迟到了,但这是我修改工作示例代码的方法。我不需要设置特定的最大和最小日期,只是不希望日期范围重叠,所以我只是让它们相互设置:

jQuery(function() {
  jQuery('#calendardatetime_required_to, #calendardatetime_required_from').datepicker('option', {
    beforeShow: customRange
  });
});

function customRange(input) {
  if (input.id == 'calendardatetime_required_to') {
    return {
      minDate: jQuery('#calendardatetime_required_from').datepicker("getDate")
    };
  } else if (input.id == 'calendardatetime_required_from') {
    return {
      maxDate: jQuery('#calendardatetime_required_to').datepicker("getDate")
    };
  }
}

(我的日期选择器已在脚本中进一步初始化,但它只是默认设置。)

似乎做我需要的事情:)

有关我的示例,请参阅here

答案 3 :(得分:4)

考虑使用rangeSelect来设置一个控件而不是两个。

为了实现您的目标,我想您需要添加onSelect侦听器,然后调用datepicker( "option", settings )来更改设置。

答案 4 :(得分:4)

txtStartDate的开始日期不起作用,因为第二次检查input.id时,第二个minDate被设置为null。此外,maxDate应检查txtEndDate,而不是txtStartDate。试试这个:

    function customRange(input) 
{ 
    var mDate = (input.id == "txtStartDate" ? new Date(2008, 12 - 1, 1) : $("#txtStartDate").datepicker("getDate"));
    return {
         minDate: mDate, 
         maxDate: (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate").getDate() + 5 : null)
       }; 
}

我不知道为什么'+ 5'而不是'+ 7',但如果我加0,我会得到一个可选择的日期范围,我选择的日期加上下一个。

答案 5 :(得分:4)

这是我在经过大量挖掘解决方案之后提出的解决方案,我认为这是一个常见问题。这有效地在兼容日的共享输入范围内“反弹”输入。含义 - 如果我有两个字段,则可以使用其中一个来约束另一个字段,另一个可以在必要时重新定义原始字段。这样做的目的是始终确保两个字段之间只有有限的天数(或数月或其他)。这个具体的例子还限制了在任何一个领域(例如3个月)中可以选择某些东西的未来时间。


$("#startdate").datepicker({
   minDate: '+5', 
   maxDate: '+3M',
   changeMonth: true,
   showAnim: 'blind',
   onSelect: function(dateText, inst){ 

    // Capture the Date from User Selection
    var oldDate = new Date(dateText);
    var newDate = new Date(dateText);

    // Compute the Future Limiting Date
    newDate.setDate(newDate.getDate()+5);


    // Set the Widget Properties
    $("#enddate").datepicker('option', 'minDate', oldDate);
    $("#enddate").datepicker('option', 'maxDate', newDate);

    }
  });

 $("#enddate").datepicker({
  minDate: '+5',
  maxDate: '+3M',
  changeMonth: true,
  showAnim: 'blind', 
  onSelect: function(dateText, inst){ 

    // Capture the Date from User Selection
    var endDate = new Date(dateText);
    var startDate = new Date(dateText);

    // Compute the Future Limiting Date
    startDate.setDate(startDate.getDate()-5);

    // Set the Widget Properties
    $("#startdate").datepicker('option', 'minDate', startDate);
    $("#startdate").datepicker('option', 'maxDate', endDate);

    }

  });

答案 6 :(得分:3)

这是我如何使用它:

function customRange(input)
{
    var min = new Date();
    return {
        minDate: ((input.id == "txtStartDate") ? min : (input.id == "txtEndDate" ? $("#txtStartDate").datepicker("getDate") : null)),
        maxDate: (input.id == "txtStartDate" ? $("#txtEndDate").datepicker("getDate") : null)
    };
}

答案 7 :(得分:0)

我就是这样做的。我从Jquery UI网站获取了源代码并对其进行了修改以添加约束。

$(document).ready(function ()
{      
  var dates = $('#StartDate, #EndDate').datepicker({
        minDate: new Date(2008, 11, 1), 
        maxDate: "+0D",
        dateFormat: "dd M yy",
        changeMonth: true,
        changeYear: true,
        onSelect: function (selectedDate)
        {
            var option = this.id == "StartDate" ? "minDate" : "maxDate",
                instance = $(this).data("datepicker"),
                date = $.datepicker.parseDate(
                    instance.settings.dateFormat ||
                    $.datepicker._defaults.dateFormat,
                    selectedDate, instance.settings);
            var edate;
            var otherOption;
            var d;
            if (option == "minDate")
            {
                otherOption = "maxDate";
                d = date.getDate() + 7;
            }
            else if (option == "maxDate")
            {
                otherOption = "minDate";
                d = date.getDate() - 7;
            }

            var m = date.getMonth();
            var y = date.getFullYear();
            edate = new Date(y, m, d);

            dates.not(this).datepicker("option", option, date);
            dates.not(this).datepicker("option", otherOption, edate);
        }
    });
});

初步构思来自:http://jqueryui.com/demos/datepicker/#date-range

注意:您还需要一个选项来重置/清除日期(即,如果用户选择'从日期','到目前为止'变得有限。选择'从日期' '如果用户现在选择'到日期',则发件人日期也会受到限制。您需要有一个明确的选项,允许用户现在选择不同的“发件人”日期。)