我知道,标题并不是非常具体,但我对DatePicker
有疑问。我尝试禁用国家日,周末和今天后48小时。目前我这样做了:
minDate: 3
beforeShow
属性中的代码我的代码目前看起来像这样:
function noWeekendsOrHolidays(date) {
var dateTime = new Date();
var dayOfWeek = dateTime.getDay();
var noWeekend = $.datepicker.noWeekends(date);
if (noWeekend[0]) {
natDays = [
[1, 1, 'au'], [5, 1, 'ar'], [5, 8, 'ar'], [7, 14, 'us'], [8, 15, 'id'], [11, 1, 'lb'], [11, 11, 'lb'], [12, 25, 'ke']
];
for (i = 0; i < natDays.length; i++) {
if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
return [false, ''];
}
}
return [true, ''];
} else {
return noWeekend;
}
}
function addDatePicker(pSelname)
{
$(pSelname).datepicker({
stepMonths: 1,
firstDay: 1,
regional:'fr',
dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
dayNamesMin: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
monthNames: ['Janvier','Fevrier','Mars','Avril','Mai','Juin','Juillet','Aout','Septembre','Octobre','Novembre','Décembre'],
monthNamesShort: ['Jan','Fev','Mai','Avr','Mai','Juin','Juil','Aou','Sep','Oct','Nov','Dec'],
dateFormat: 'dd-mm-yy',
beforeShowDay: noWeekendsOrHolidays,
minDate: 3,
beforeShow : function() {
var dateTime = new Date();
var dayOfWeek = dateTime.getDay();
if(dayOfWeek == 4 || dayOfWeek == 5) {
$(this).datepicker( "option", "minDate", "5" );
}
}
});
}
所以,我不知道如何处理这个案子:(今天+ 48小时)+周末+国庆日。我写了几个需要在DatePicker
上重现的案例:
如果周末有国庆日,我不算数。
该月的每一天都会执行noWeekendsOrHolidays
功能,所以如果有国庆日,我需要每天检查。
所以我的第一个问题是:这真的可以吗?我可以使用哪种算法来解决这个问题?
由于
答案 0 :(得分:0)
所以,我不知道如何处理这个案子:(今天+ 48小时)+周末 +本周的国庆日。
所以我的第一个问题是:这真的可以吗?
是
我可以使用哪种算法来解决这个问题?
将您的问题分解成更小的部分。这是一个粗略的例子:
您不需要做任何额外的事情,因为jQuery UI Datepicker将为您完成。您只能使用所选日期调用noWeekends
方法:
jQuery.datepicker.noWeekends(selDate)
您可以拥有一个包含日期的数组,如下所示:
var nationalDays = ['2015-09-17', '2015-09-21', '2015-09-28'];
接下来,创建一个函数,该函数将检查该数组中是否存在特定日期。像这样:
function chkNationalDays(selectedDate) {
var retVal = [true, '', ''];
nationalDays.forEach(function(dt) {
var today = new Date(dt);
if (isEqual(selectedDate, today)) {
retVal = [false, '', '']; return;
}
});
return retVal;
};
请记住,beforeShowDay
需要三个值的数组(0)一个布尔值,指定是否需要禁用当前日期(1)用于样式化日期的css类,以及(2)要显示的文本在工具提示中。
创建另一个函数来检查这个。类似的东西:
function chkNext2Days(selectedDate) {
var today = new Date();
if (isEqual(selectedDate, today)) return [false, '', ''];
today.setDate(today.getDate() + 1);
if (isEqual(selectedDate, today)) return [false, '', ''];
today.setDate(today.getDate() + 1);
if (isEqual(selectedDate, today)) return [false, '', ''];
return [true, '', ''];
}
返回beforeShowDay
期望的数组。
现在将所有案例组合在一起,检查返回数组的第一个元素是否返回false。非常简单但粗略地看起来像这样:
function noWeekendsOrHolidays(selDate) {
var noWeekend = jQuery.datepicker.noWeekends(selDate),
noNationalDays = chkNationalDays(selDate),
noNext2Days = chkNext2Days(selDate),
retVal = true;
if (noWeekend[0]) {
if (noNationalDays[0]) {
return noNext2Days;
} else {
return noNationalDays;
}
} else {
return noWeekend;
}
};
beforeShowDay
。这很简单:
$("#dateInput").datepicker({
beforeShowDay: noWeekendsOrHolidays,
...
});
这是一个工作演示,包含所有代码:
<强>段强>:
var nationalDays = ['2015-09-17', '2015-09-21', '2015-09-28'];
$("#dt1").datepicker({
dateFormat : 'yy-mm-dd',
beforeShowDay: noWeekendsOrHolidays
});
function noWeekendsOrHolidays(selDate) {
var noWeekend = jQuery.datepicker.noWeekends(selDate),
noNationalDays = chkNationalDays(selDate),
noNext2Days = chkNext2Days(selDate),
retVal = true;
if (noWeekend[0]) {
if (noNationalDays[0]) {
return noNext2Days;
} else {
return noNationalDays;
}
} else {
return noWeekend;
}
};
function chkNext2Days(selectedDate) {
var today = new Date();
if (isEqual(selectedDate, today)) return [false, '', ''];
today.setDate(today.getDate() + 1);
if (isEqual(selectedDate, today)) return [false, '', ''];
today.setDate(today.getDate() + 1);
if (isEqual(selectedDate, today)) return [false, '', ''];
return [true, '', ''];
}
function chkNationalDays(selectedDate) {
var retVal = [true, '', ''];
nationalDays.forEach(function(dt) {
var today = new Date(dt);
if (isEqual(selectedDate, today)) {
retVal = [false, '', '']; return;
}
});
return retVal;
};
function isEqual(srcDate, tarDate) {
if ((srcDate.getDate() == tarDate.getDate()) &&
(srcDate.getMonth() == tarDate.getMonth()) &&
(srcDate.getFullYear() == tarDate.getFullYear())) {
return true;
} else { return false; }
}
&#13;
<link href="https://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.2/jquery-ui.min.js"></script>
Date: <input id="dt1" />
&#13;