我希望能够链接多对jQuery UI datepicker实例,以便每对中的第二个不能选择比第一个更早的日期。我正在关注this example开始。
示例:
<ul>
<li>
<input class="counter" name="counter" type="hidden" value="43"/>
<label>Start: </label><input name="start_43" id="start_43" size="10" />
<label>End: </label><input name="end_43" id="end_43" size="10" />
</li>
<li>
<input class="counter" name="counter" type="hidden" value="44"/>
<label>Start: </label><input name="start_44" id="start_44" size="10" />
<label>End: </label><input name="end_44" id="end_44" size="10" />
</li>
</ul>
我通过找到“计数器”号来循环实例:
$(document).ready(function() {
var starts = $("input[name='counter']");
var dates = new Array();
starts.each(function(){
var x = this.value;
// http://jqueryui.com/demos/datepicker/#date-range
dates[x] = $( "#start_"+x+", #end_"+x ).datepicker({
onSelect: function( selectedDate ) {
var option = this.id == "#start_"+x ? "minDate" : "maxDate",
instance = $( this ).data( "datepicker" );
date = $.datepicker.parseDate(
instance.settings.dateFormat ||
$.datepicker._defaults.dateFormat,
selectedDate, instance.settings );
dates[x].not( this ).datepicker( "option", option, date );
}
});
});
});
这适用于在每个输入上启用日期选择器,但它不会阻止第二个实例在第一个实例之前选择日期。实际上它要求第二个实例在第一个实例之前选择一个日期。选中后,第二个实例将填充两个输入!
谁能看到我出错的地方?
答案 0 :(得分:4)
我不是100%关于parseDate的用途,也不是为什么要从数据存储中检索实例。但是,我认为你的主要问题是this.id测试。 ID永远不会以实际DOM元素中的#开头。
onSelect: function(selectedDate) {
var option = this.id.indexOf("start_") != -1 ? "minDate" : "maxDate";
dates[i].not(this).datepicker("option", option, selectedDate);
}
上面应该这样做,或者你可能只是从你的代码中取出哈希(我刚刚做了,似乎工作正常)。 :
答案 1 :(得分:0)
这将有效
$("#FirstCal").datepicker({
dateFormat: 'M d, yy',
navigationAsDateFormat: true, prevText: 'M', nextText: 'M',
changeMonth: true,
changeYear: true,
showOn: "both",
showStatus: true,
firstDay: 0,
changeFirstDay: false,
beforeShow: customRange,
buttonImage: '/Content/images/Calendar_img.png',
buttonImageOnly: true
});
$("#secondCal").datepicker({
dateFormat: 'M d, yy',
navigationAsDateFormat: true, prevText: 'M', nextText: 'M',
changeMonth: true,
changeYear: true,
showOn: "both",
showStatus: true,
firstDay: 0,
changeFirstDay: false,
beforeShow: customRange,
buttonImage: '/Content/images/Calendar_img.png',
buttonImageOnly: true
});
function customRange(input) {
var min = new Date();
var min = new Date('<%=DateTime.Now.Year %>', '0', '1');
var max = new Date('<%=DateTime.Now.AddYears(1).Year %>', '11', '31');
var dateMin = min;
var dateMax = max;
if (input.id == "firstCal" && $("#secondCal").datepicker("getDate") != null) {
if (dateMin < min) {
dateMin = min;
}
}
else if (input.id == "secondCal") {
if ($("#firstCal").datepicker("getDate") != null) {
dateMin = $("#firstCal").datepicker("getDate");
}
}
return {
minDate: dateMin,
maxDate: dateMax
};
}