【问题标题】:jQuery datepicker- 2 inputs/textboxes and restricting rangejQuery datepicker- 2 个输入/文本框和限制范围
【发布时间】:2010-09-24 17:59:27
【问题描述】:

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

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

  2. "To" 日期可以是 no 比今天晚

  3. 一次 “发件人” 日期 被选中,“To”日期只能 在 7 天后的范围内 “从”日期

  4. 如果 "To" 日期是 首先选择,然后是“从”日期 只能在7的范围内 “至” 日期前几天(带有 12 月 1 日的限制是第一个 可选日期)

我似乎无法将以上所有内容一起工作。

总之,我希望能够选择从 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”日期。任何帮助将不胜感激,谢谢。

【问题讨论】:

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


【解决方案1】:

非常感谢您的帮助 Ben,我在您的帖子的基础上提出了这个问题。它现在已经完成并且运行良好!

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

下面的完整代码-

$(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
    };     
}

【讨论】:

  • 很好的答案,这对我很有帮助。
  • 太棒了!!帮了我很多!
【解决方案2】:

我意识到我参加聚会有点晚了,但这是我修改工作示例代码的方式。我不需要设置具体的最大和最小日期,只是不想日期范围重叠,所以我只是让它们互相设置:

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】:

好的,这个怎么样:

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
   }; 

}

这是我能想到的满足您所有要求的最佳方案(我认为...)

【讨论】:

    【解决方案4】:

    考虑使用 rangeSelect 来拥有一个控件而不是两个。

    为了实现你所追求的,我想你需要添加一个 onSelect 监听器,然后调用datepicker( "option", settings ) 来更改设置。

    【讨论】:

    • 使用一个控件是可能的,但我更愿意尝试将“从”和“到”日期保留在单独的控件中以保持当前 UI 的一致性。
    【解决方案5】:

    您的 txtStartDate 开始日期不起作用,因为您的第二个 minDate 在第二次检查 input.id 时被设置为 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,我会得到一个可选择的日期范围,即我选择的日期加上下一个日期。

    【讨论】:

    • 这解决了从“开始”日期到“结束”日期的 7 天的可选范围,但如果在选择“开始”日期之前选择“结束”日期,则会出错。
    • 是的,我在第一次通过时错过了您的一些要求。请参阅我的其他答案。
    【解决方案6】:

    这是我在大量挖掘我认为是常见问题的解决方案后提出的解决方案。这有效地在兼容天数的共享输入范围内“反弹”输入。含义 - 如果我有两个字段,任何一个都可以用来约束另一个,如果需要,另一个可以重新定义原始字段。这样做的目的是始终确保两个字段之间只有有限的天数(或数月或其他)。这个特定示例还限制了未来可以在任一字段中选择某些内容的时间(例如 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); } });

    【讨论】:

      【解决方案7】:

      这就是我使用它的方式:

      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)
          };
      }
      

      【讨论】:

        【解决方案8】:

        我就是这样做的。我从 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

        注意:您还需要一个选项来重置/清除日期(即,如果用户选择“起始日期”,则“截止日期”会受到限制。选择“起始日期”后' 如果用户现在选择“截止日期”,则起始日期也会受到限制。您需要有一个明确的选项以允许用户现在选择不同的“起始”日期。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-14
          • 2013-01-18
          • 1970-01-01
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 1970-01-01
          相关资源
          最近更新 更多