Javascript 使用fullcalendar跳过周末和拆分日期,事件块为3天
我有一个关于“fullcalendar”插件的问题,可以在这里查看 我想要实现的是对我当前脚本的修改,该脚本位于下面的JSFIDLE链接上。这是为了创建一个事件拆分块。当外部事件在星期五附近拖放时,3天的事件块将拆分,并跳过星期六和星期日,而将其余的事件块放置在星期一和星期二 我下面的脚本当前将三天的外部事件放置在放置事件后的任意三天 JSFIDLE链路 为了创建3天块,我添加了以下内容Javascript 使用fullcalendar跳过周末和拆分日期,事件块为3天,javascript,jquery,html,fullcalendar,Javascript,Jquery,Html,Fullcalendar,我有一个关于“fullcalendar”插件的问题,可以在这里查看 我想要实现的是对我当前脚本的修改,该脚本位于下面的JSFIDLE链接上。这是为了创建一个事件拆分块。当外部事件在星期五附近拖放时,3天的事件块将拆分,并跳过星期六和星期日,而将其余的事件块放置在星期一和星期二 我下面的脚本当前将三天的外部事件放置在放置事件后的任意三天 JSFIDLE链路 为了创建3天块,我添加了以下内容 var threeDayBlock = new Date(date.getTime()); threeDay
var threeDayBlock = new Date(date.getTime());
threeDayBlock.setDate(threeDayBlock.getDate() + 2);
copiedEventObject.end = threeDayBlock;
没有内置的解决方案来做你想做的事情,而且多日活动不能跳过间隔内的几天;所以我喜欢找一个,这是我的解决方案 剧本是这样写的;对于给定的开始日期,我根据周末找到了正确的接下来两天,并用单个日期设置了三个变量。 对于每个日期,我都会找到周数,并使用它来确定是否必须创建一个多天事件或更多事件 最相关的代码是:
var firstDay = new Date(date.getTime());
while (firstDay.getDay() == 0 || firstDay.getDay() == 6) {
firstDay.setDate(firstDay.getDate() + 1);
}
var secondDay = new Date(firstDay.getTime());
do {
secondDay.setDate(secondDay.getDate() + 1);
} while (secondDay.getDay() == 0 || secondDay.getDay() == 6);
var thirdDay = new Date(secondDay.getTime());
do {
thirdDay.setDate(thirdDay.getDate() + 1);
} while (thirdDay.getDay() == 0 || thirdDay.getDay() == 6);
要检查日期的周数并检查周数是否相同,我使用以下功能:
function getWeekNr(today)
{
Year = takeYear(today);
Month = today.getMonth();
Day = today.getDate();
now = Date.UTC(Year,Month,Day+1,0,0,0);
var Firstday = new Date();
Firstday.setYear(Year);
Firstday.setMonth(0);
Firstday.setDate(1);
then = Date.UTC(Year,0,1,0,0,0);
var Compensation = Firstday.getDay();
if (Compensation > 3) Compensation -= 4;
else Compensation += 3;
NumberOfWeek = Math.round((((now-then)/86400000)+Compensation)/7);
return NumberOfWeek;
}
function takeYear(theDate)
{
x = theDate.getYear();
var y = x % 100;
y += (y < 38) ? 2000 : 1900;
return y;
}
最终代码:
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
editable: true,
droppable: true, // this allows things to be dropped onto the calendar !!!
drop: function (date, allDay) { // this function is called when something is dropped
// retrieve the dropped element's stored Event Object
var originalEventObject = $(this).data('eventObject');
var firstDay = new Date(date.getTime());
while (firstDay.getDay() == 0 || firstDay.getDay() == 6) {
firstDay.setDate(firstDay.getDate() + 1);
}
var secondDay = new Date(firstDay.getTime());
do {
secondDay.setDate(secondDay.getDate() + 1);
} while (secondDay.getDay() == 0 || secondDay.getDay() == 6);
var thirdDay = new Date(secondDay.getTime());
do {
thirdDay.setDate(thirdDay.getDate() + 1);
} while (thirdDay.getDay() == 0 || thirdDay.getDay() == 6);
var dateAdd = new Array();
if (getWeekNr(firstDay)==getWeekNr(secondDay) && getWeekNr(firstDay)==getWeekNr(thirdDay)) {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
else {
if (getWeekNr(firstDay)==getWeekNr(secondDay)){
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = secondDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = thirdDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
else {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = firstDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = secondDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
}
$.each(dateAdd, function (index, value) {
$('#calendar').fullCalendar('renderEvent', value, true);
});
// is the "remove after drop" checkbox checked?
if ($('#drop-remove').is(':checked')) {
// if so, remove the element from the "Draggable Events" list
$(this).remove();
}
}
});
工作演示:答案与前一个类似,但通过支持所需的
四天事件来扩展它(可以简单地切换到五天,我正在考虑一个没有ifs的解决方案,正在工作…),并改进主体if语句
这里是一个5天事件:脚本通过检查开始日期和后续日期是否在同一周内(如果不在数组的两个不同元素中)来构建一个日历事件数组。最后,代码循环此数组并在日历上创建事件
我正在考虑一个更好的解决方案,但现在就是这样
代码:
演示:您是否认为它最终会制作两个活动?一个星期五,一个星期一,一个星期二?还是应该是周五到周二的活动?嗨@Ryley谢谢你花时间回答!至于你的问题,它应该是同一个事件。所以你不介意这个事件实际上是5天长吗?嗨@Ryley,这个事件应该是3天长。刚从星期五星期一星期二开始。因为它避开了周末。再次感谢您的帮助。我只是有点困惑我该如何处理这种情况。好吧。。。我不认为FullCalendar支持这一点,至少我在文档中没有看到任何提及。所以你可能没钱了,我想把三天的时间改为四天。我需要在您创建的if和elseif语句中添加什么?你能解释一下你的方法吗?第四天创建一个新的var,计算它,检查w.e.与否,第四天执行if。我在手机上,现在无法添加更多信息我在尝试调整你的if时遇到了一些问题(getWeekNr(第一天)==getWeekNr(第二天)&&getWeekNr(第一天)==getWeekNr(第三天)){为了符合延长活动日的标准,您是否介意让我看看您在小提琴上的回复是什么意思?再次感谢您的努力,我非常感谢您在这方面的帮助。我只在手机上呆了一个星期,所以我现在帮不上什么忙:-(测试检查活动的日期是否在同一周内,如果不创建不同的活动Shey Edward,再次感谢您在这个问题上的帮助。我想知道您何时有更多的访问权限,是否可以跟进我的上述问题。非常感谢!谢谢。
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
editable: true,
droppable: true, // this allows things to be dropped onto the calendar !!!
drop: function (date, allDay) { // this function is called when something is dropped
// retrieve the dropped element's stored Event Object
var originalEventObject = $(this).data('eventObject');
var firstDay = new Date(date.getTime());
while (firstDay.getDay() == 0 || firstDay.getDay() == 6) {
firstDay.setDate(firstDay.getDate() + 1);
}
var secondDay = new Date(firstDay.getTime());
do {
secondDay.setDate(secondDay.getDate() + 1);
} while (secondDay.getDay() == 0 || secondDay.getDay() == 6);
var thirdDay = new Date(secondDay.getTime());
do {
thirdDay.setDate(thirdDay.getDate() + 1);
} while (thirdDay.getDay() == 0 || thirdDay.getDay() == 6);
var dateAdd = new Array();
if (getWeekNr(firstDay)==getWeekNr(secondDay) && getWeekNr(firstDay)==getWeekNr(thirdDay)) {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
else {
if (getWeekNr(firstDay)==getWeekNr(secondDay)){
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = secondDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = thirdDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
else {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = firstDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = secondDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
}
$.each(dateAdd, function (index, value) {
$('#calendar').fullCalendar('renderEvent', value, true);
});
// is the "remove after drop" checkbox checked?
if ($('#drop-remove').is(':checked')) {
// if so, remove the element from the "Draggable Events" list
$(this).remove();
}
}
});
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
editable: true,
droppable: true, // this allows things to be dropped onto the calendar !!!
drop: function (date, allDay) { // this function is called when something is dropped
// retrieve the dropped element's stored Event Object
var originalEventObject = $(this).data('eventObject');
var firstDay = new Date(date.getTime());
while (firstDay.getDay() == 0 || firstDay.getDay() == 6) {
firstDay.setDate(firstDay.getDate() + 1);
}
var secondDay = new Date(firstDay.getTime());
do {
secondDay.setDate(secondDay.getDate() + 1);
} while (secondDay.getDay() == 0 || secondDay.getDay() == 6);
var thirdDay = new Date(secondDay.getTime());
do {
thirdDay.setDate(thirdDay.getDate() + 1);
} while (thirdDay.getDay() == 0 || thirdDay.getDay() == 6);
var fourthDay = new Date(thirdDay.getTime());
do {
fourthDay.setDate(fourthDay.getDate() + 1);
} while (fourthDay.getDay() == 0 || fourthDay.getDay() == 6);
var dateAdd = new Array();
if (getWeekNr(firstDay) == getWeekNr(fourthDay)) {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = fourthDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
} else if (getWeekNr(firstDay) == getWeekNr(thirdDay)) {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = thirdDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = fourthDay;
copiedEventObject.end = fourthDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
} else if (getWeekNr(firstDay) == getWeekNr(secondDay)) {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = secondDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = thirdDay;
copiedEventObject.end = fourthDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
} else {
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = firstDay;
copiedEventObject.end = firstDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
var copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = secondDay;
copiedEventObject.end = fourthDay;
copiedEventObject.allDay = allDay;
dateAdd.push(copiedEventObject);
}
$.each(dateAdd, function (index, value) {
$('#calendar').fullCalendar('renderEvent', value, true);
});
// is the "remove after drop" checkbox checked?
if ($('#drop-remove').is(':checked')) {
// if so, remove the element from the "Draggable Events" list
$(this).remove();
}
}
});