Javascript 如何防止选择中间有禁用日期的日期范围?
我有两个Jquery日期选择器,可以在其中选择一系列日期 我已经实施了一些限制,比如,textbox2的日期应该总是大于textbox1。此外,我还禁用了某些日期 我需要的是,如果用户选择from date,然后选择to date,如果其间存在禁用的日期,那么用户应该不能选择该范围 例如: 我已禁用日期:2014年5月31日、2014年6月1日、2014年6月2日 如果用户选择日期1为2014年5月29日,并尝试选择2014年6月4日作为第二个日期,那么他应该无法这样做,因为禁用日期介于两者之间。date2的最大值必须为2014年5月30日Javascript 如何防止选择中间有禁用日期的日期范围?,javascript,jquery,jquery-ui,date,jquery-ui-datepicker,Javascript,Jquery,Jquery Ui,Date,Jquery Ui Datepicker,我有两个Jquery日期选择器,可以在其中选择一系列日期 我已经实施了一些限制,比如,textbox2的日期应该总是大于textbox1。此外,我还禁用了某些日期 我需要的是,如果用户选择from date,然后选择to date,如果其间存在禁用的日期,那么用户应该不能选择该范围 例如: 我已禁用日期:2014年5月31日、2014年6月1日、2014年6月2日 如果用户选择日期1为2014年5月29日,并尝试选择2014年6月4日作为第二个日期,那么他应该无法这样做,因为禁用日期介于两者之间
添加我在代码中添加了一个函数validateDateRange,以说明完成此任务所需的逻辑。请注意,我添加的函数的目的是,如果出现您描述的情况,只需弹出一个警报。从这里你应该可以做任何你喜欢的事。如果您有更多问题或正在寻找其他信息,请告知我们
如果jQueryUIDatePicker不支持这样的功能,那么手动方式就是最好的选择 您可以在开始日期选择器中使用日期选择器的onSelect选项来实现此功能
$('#start_date').datepicker(
{
beforeShow: customRangeStart,
beforeShowDay: unavailable,
minDate: 0,
dateFormat: "yy-mm-dd",
changeYear: true,
onSelect: function() {
//Do validation functionality here
triggerOnStartSelect();
}
});
并将用于设置end_date picker的新maxDate的验证功能记录为:
//Trigger upon change event of either start or end date
function triggerOnStartSelect(){
var startDate = new Date($("#start_date").datepicker("getDate"));
var endDate = new Date($("#end_date").datepicker("getDate"));
//if required you could reset all of the default setting here //
//And can also validate the date objects
//Holds to be set maxdate of end_date datepicker
var tempEndDate= null ;
//unavailableDateObjects : Array of date objects listed as disabled
$.each(unavailableDateObjects, function(i, disabledRangeDate) {
if (startDate < disabledRangeDate) {
tempEndDate=new Date(disabledRangeDate);
//subtracts one day from the nearest disabled range date
tempEndDate.setDate(tempEndDate.getDate() - 1);
return false;
}
});
//Sets maxDate to the closest disabled date range or null . if null denotes no maxdate.
$( "#end_date" ).datepicker( "option", "maxDate", tempEndDate);
}
您也可以直接定义类似于unavailableDates数组的日期数组对象:
将在初始化日期字符串数组后调用
看看这个
在解决这个问题的过程中,我发现可以用来解决这个问题的一个有趣的问题是:
请把你的代码贴在这里,这样未来的so访客可以享受到它的所有缩进的荣耀。我支持这一点。非常好的解决方案。
//Trigger upon change event of either start or end date
function triggerOnStartSelect(){
var startDate = new Date($("#start_date").datepicker("getDate"));
var endDate = new Date($("#end_date").datepicker("getDate"));
//if required you could reset all of the default setting here //
//And can also validate the date objects
//Holds to be set maxdate of end_date datepicker
var tempEndDate= null ;
//unavailableDateObjects : Array of date objects listed as disabled
$.each(unavailableDateObjects, function(i, disabledRangeDate) {
if (startDate < disabledRangeDate) {
tempEndDate=new Date(disabledRangeDate);
//subtracts one day from the nearest disabled range date
tempEndDate.setDate(tempEndDate.getDate() - 1);
return false;
}
});
//Sets maxDate to the closest disabled date range or null . if null denotes no maxdate.
$( "#end_date" ).datepicker( "option", "maxDate", tempEndDate);
}
var unavailableDates = ["31-5-2014", "1-6-2014", "2-6-2014", "3-6-2014"];
//Convert String Date List to Date object List
function convertDisabledFieldToDateObject(diabledList) {
var dateList = [];
$.each(diabledList, function (i, singleDate) {
var parsedDate = $.datepicker.parseDate("dd-mm-yy",singleDate);
dateList.push(parsedDate);
});
//Sort date if the diabled date sets are in jumbled order
dateList.sort(function(date1, date2){
return date1 - date2;
});
return dateList;
}
var StartDate = $("#start_date").val();
var EndDates = $("#end_date").val();
var selectedDate = $("#selected_date").val();
//-- Start Date Convert in YMD
var Sdate = StartDate.split("-");
var Syear= Sdate[2];
var Smonth= Sdate[1];
var Sday= Sdate[0];
var SYMDDate = Syear + '-' + Smonth + '-' + Sday;
var newdate= new Date(SYMDDate);
var StartDateStrToTime=newdate.getTime();
//-- End Date Convert in YMD
var Edate = EndDates.split("-");
var Eyear= Edate[2];
var Emonth= Edate[1];
var Eday= Edate[0];
var EYMDDate = Eyear + '-' + Emonth + '-' + Eday;
var newdates= new Date(EYMDDate);
var EndDateStrToTime=newdates.getTime();
//-- Selected Date Convert in YMD
var Cdate = selectedDate.split("-");
var Cyear= Cdate[2];
var Cmonth= Cdate[1];
var Cday= Cdate[0];
var CYMDDate = Cyear + '-' + Cmonth + '-' + Cday;
var newdateses= new Date(CYMDDate);
var SelectedDateStrToTime=newdateses.getTime();
if((SelectedDateStrToTime>=StartDateStrToTime) && (SelectedDateStrToTime<=EndDateStrToTime))
{}
else
{
alert("Please Select date between "+StartDate+" to " +EndDates+".");
$("#selected_date").val(EndDates);
}