我正在使用带有两个输入框的jQuery Datepicker小部件,一个用于“From”日期,第二个用于“To”日期。我使用jQuery Datepicker functional demo作为使两个输入框相互协作的基础,但我需要能够添加这些额外的限制:
日期范围不能早于 2008年12月1日
“至”日期可以是否定的 晚于今天
一旦“来自”日期 如果选中,“至”日期只能 在7天之内 “来自”日期
如果“至”日期为 首先选择,然后选择“From”日期 只能在7的范围内 在“To”日期之前的几天(使用 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”日期选择。任何帮助将不胜感激,谢谢。
答案 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
注意:您还需要一个选项来重置/清除日期(即,如果用户选择'从日期','到目前为止'变得有限。选择'从日期' '如果用户现在选择'到日期',则发件人日期也会受到限制。您需要有一个明确的选项,允许用户现在选择不同的“发件人”日期。)