代码之家  ›  专栏  ›  技术社区  ›  Russ Cam

jQuery日期选择器-2个输入/文本框和限制范围

  •  50
  • Russ Cam  · 技术社区  · 17 年前

    “到” 日期我正在使用 jQuery Datepicker functional demo 作为使两个输入框相互工作的基础,但我需要能够添加以下附加限制:

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

    2. “到” 日期可以是no

    3. “来自” 日期 如果选择,则 日期只能是 在之后的7天内 这个 “来自” 日期

    4. “到” 首先选择,然后选择 “来自” 只能在7的范围内 “到” 日期(带日期) 可选择日期)

    我似乎无法使以上所有的工作一起进行。

    到目前为止我的代码

    $(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日之前或今天之后。任何帮助都将不胜感激,谢谢。

    8 回复  |  直到 12 年前
        1
  •  49
  •   Russ Cam    15 年前

    这里有一个 Working Demo . 添加 转到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
  •  15
  •   Robin Duckett    16 年前

    我意识到我参加聚会有点晚了,但下面是我如何修改工作示例代码的。我不需要设置特定的最大和最小日期,只是不希望日期范围重叠,所以我让它们相互设置:

    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
  •  14
  •   Ben Koehler    17 年前

    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
  •  4
  •   kgiannakakis    17 年前

    考虑使用RangeSead有一个控件而不是两个控件。

    datepicker( "option", settings ) 更改设置。

        5
  •  4
  •   Ben Koehler    17 年前

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

        6
  •  4
  •   David Bigelow    15 年前

    这里有一个解决方案,我经过大量的挖掘,找到了一个我认为是一个常见问题的解决方案。这有效地“反弹”了在兼容天数的共享输入范围内的输入。意思-如果我有两个字段,其中一个可以用来约束另一个,另一个可以在必要时重新定义原始字段。这样做的目的是始终确保两个字段之间只有有限的天数(或月或其他时间)。此特定示例还限制了未来在任一字段中选择某项内容的时间(例如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
  •  3
  •   gaby    16 年前

    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
  •  0
  •   escist    14 年前

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

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

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