我想知道如何限制fullcalendar显示三个月的时间段,并在其余的几个月内取消选择,就像在一个日期选择器中一样?
E.g。当前月份是2010年5月,我只希望日历显示5月和4月(点击上个月)和Jun(点击下个月),剩下的几个月将从用户选择中取消选择。
我不确定我是否错过了阅读fullcalendar文档中的任何部分。好心提醒。谢谢。
答案 0 :(得分:16)
对于版本2中的FullCalendar,将viewDisplay : function(view) {
更改为
viewRender: function(view,element) {
(本页示例中的混合解决方案):
$('#calendar').fullCalendar({
//restricting available dates to 2 moths in future
viewRender: function(view,element) {
var now = new Date();
var end = new Date();
end.setMonth(now.getMonth() + 2); //Adjust as needed
if ( end < view.end) {
$("#calendar .fc-next-button").hide();
return false;
}
else {
$("#calendar .fc-next-button").show();
}
if ( view.start < now) {
$("#calendar .fc-prev-button").hide();
return false;
}
else {
$("#calendar .fc-prev-button").show();
}
}
});
答案 1 :(得分:9)
这是基于tauren的answer,但包括必要的日期数学和全日历选择器以将其拉出(此代码使用12个月的范围):
jQuery('#edit-calendar').fullCalendar({
viewDisplay : function(view) {
var now = new Date();
var end = new Date();
end.setMonth(now.getMonth() + 11); //Adjust as needed
var cal_date_string = view.start.getMonth()+'/'+view.start.getFullYear();
var cur_date_string = now.getMonth()+'/'+now.getFullYear();
var end_date_string = end.getMonth()+'/'+end.getFullYear();
if(cal_date_string == cur_date_string) { jQuery('.fc-button-prev').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-prev').removeClass("fc-state-disabled"); }
if(end_date_string == cal_date_string) { jQuery('.fc-button-next').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-next').removeClass("fc-state-disabled"); }
}
});
答案 2 :(得分:4)
我还没有这样做,所以我不确定这会有效。但你至少可以尝试看看。
我可能会考虑自定义viewDisplay
回调。它会收到View Object,其中包含start
属性。您可以使用View对象属性来测试用户正在查看的视图和日期,然后根据它执行操作。
我不确定fullcalendar是否以这种方式工作,但是如果您从回调中return false
,某些插件将中止操作。因此,您可以查看start
日期,如果它超出了您可接受的月份范围,则return false
将中止该操作。
如果这不起作用,在viewDisplay
内,您可以再次检查start
日期。如果下个月或上个月超出范围,那么您可以使用jQuery选择器来获取上一个/下一个按钮并禁用它们。这样,用户将无法切换到超出范围的月份。
此外,如果用户处于超出范围的月份,您可以立即发出gotoDate
命令切换到有效月份。
$('#calendar').fullCalendar({
viewDisplay: function(view) {
// maybe return false aborts action?
if (view.start > lastDayOfNextMonth) {
return false;
}
// or disable next button if this is last valid month
if (view.end + oneDay >= lastValidDate) {
$("#calendar #fc-button-next").attr("disabled","disabled");
}
// or gotoDate if view.start is out of range
if (view.start > lastValidDate) {
// gotoDate
}
}
});
有许多方法可以在那里进行逻辑和数据计算,但我认为你可以通过这种方式获得一些东西。
答案 3 :(得分:3)
您可以使用选项
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
validRange: {
start: '2017-05-01',//start date here
end: '2017-07-01' //end date here
},
defaultDate: '2017-05-12'
});
答案 4 :(得分:2)
var academicYearStartDate = new Date('2013/4/10');
var academicYearEndDate = new Date('2014/4/10');
viewDisplay: function (view) {
//========= Hide Next/ Prev Buttons based on academic year date range
if (view.end > academicYearEndDate) {
$("#SchoolCalender .fc-button-next").hide();
return false;
}
else {
$("#SchoolCalender .fc-button-next").show();
}
if (view.start < academicYearStartDate) {
$("#SchoolCalender .fc-button-prev").hide();
return false;
}
else {
$("#SchoolCalender .fc-button-prev").show();
}
}
答案 5 :(得分:1)
$('#calendar').fullCalendar({
viewDisplay : function(view) {
var now = new Date();
var end = new Date();
var begin = new Date ();
end.setMonth(now.getMonth() + 12); //Adjust as needed
begin.setMonth(now.getMonth() - 12); //Adjust as needed
var cal_date_string = view.start.getMonth()+'/'+view.start.getFullYear();
var cur_date_string = now.getMonth()+'/'+now.getFullYear();
var end_date_string = end.getMonth()+'/'+end.getFullYear();
var begin_date_string = begin.getMonth()+'/'+begin.getFullYear();
if(cal_date_string == begin_date_string) { jQuery('.fc-button-prev').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-prev').removeClass("fc-state-disabled"); }
if(end_date_string == cal_date_string) { jQuery('.fc-button-next').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-next').removeClass("fc-state-disabled"); }
}
答案 6 :(得分:0)
我遇到了类似的情况:我有一个事件计划,并希望将Fullcalendar限制为事件的日期范围(例如,12周)。因此,如果今天是在第6周,则日历仅显示用户点击下一个或上一个的第1周到第12周的日期。我看了修改fullcalendar.js,但没有时间绕过我的项目时间表来这样做。所以我在这里做了一个解决方法:
在自定义jQuery文件.js中,添加 dayClick 的fullCalendar方法,该方法将日期视为变量:
if(+ date&lt; + jQuery.startDate || + date&gt; jQuery.endDate){
var $ date_out_of_range_dialog = jQuery('') .html('
抱歉,您选择的日期超出了当前程序的日期范围。
开始日期:'+(jQuery.startDate .getMonth()+ 1)+'/'+ jQuery.startDate.getDate()+'/'+ jQuery.startDate.getFullYear()+'
结束日期: '+(jQuery.endDate.getMonth()+ 1)+'/'+ jQuery.endDate.getDate()+'/'+ jQuery.endDate.getFullYear()+'
') 。对话({ autoOpen:false, 莫代尔:是的, 标题:'日期超出范围', 宽度:600, 纽扣: { “Ok”:function(){ jQuery的(本).dialog( “关闭”); } } })
$ date_out_of_range_dialog.dialog( '开放');
}其他{
//在范围内执行当天查看/添加/删除事件等其他操作。
}
打开对话框窗口的.dialog方法来自mootools,但jQuery中可以使用类似的东西。我在jQuery之前。 startDate和endDate,以便通过我的.js文件提供变量。
以下是datepicker选择日期并在fullCalendar上选择的代码:
的jQuery( '#datepicker_for_calendar')。日期选择器({ defaultDate:jQuery.startDate, minDate:jQuery.startDate, maxDate:jQuery.endDate, 内联:是的, showButtonPanel:是的, onSelect:function(dateText,inst){ var d = new Date(dateText); jQuery('#calendar')。fullCalendar('gotoDate',d); selectedDate = d; } });
答案 7 :(得分:0)
轮到我添加一个调整。然而,这是基于lewsid的answer,其中包括必要的日期数学和全日历选择器,以便将其拉出来,但有一个扭曲。
我刚刚添加了两个if,你可以选择使用其中一个或两个,或者没有。 他们的目的是针对特定日期,只是因为你允许例如“2个月”前后,如果你在一周内查看“今天”+ 2个月可能被禁用,而且,在你前进后可能会被阻止回到“今天”。
jQuery('#edit-calendar').fullCalendar({
viewDisplay : function(view) {
var now = new Date();
var end = new Date();
end.setMonth(now.getMonth() + 2); //Adjust as needed
var cal_date_string = view.start.getMonth()+'/'+view.start.getFullYear();
var cur_date_string = now.getMonth()+'/'+now.getFullYear();
var end_date_string = end.getMonth()+'/'+end.getFullYear();
// TWEAK: Day Specific Vars
var cal_date_month_day = parseInt(view.start.getDate());
var cur_date_month_day = parseInt(now.getDate());
// TWEAK: Only Disable if I can see today!
if(cal_date_string == cur_date_string && cal_date_month_day <= cur_date_month_day) { jQuery('.fc-button-prev').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-prev').removeClass("fc-state-disabled"); }
// TWEAK: Only Disable if I really did reach "Today" + months
if(end_date_string == cal_date_string && cal_date_month_day >= cur_date_month_day) { jQuery('.fc-button-next').addClass("fc-state-disabled"); }
else { jQuery('.fc-button-next').removeClass("fc-state-disabled"); }
}
});
答案 8 :(得分:0)
我喜欢lewsid的答案,但它有一些问题。首先,view.start是一个Moment,而不是一个日期,因此getMonth()
不存在。其次,视图的start
只是该月的第一个可见日,意味着日期可以来自上个月。要避免这种情况,请使用其intervalStart
属性。
这是我的实现,让日历列出当前年份。
viewRender: function(view, element) {
var now = new Date(new Date().getFullYear(), 0, 1);
var end = new Date(new Date().getFullYear(), 11, 31);
var calDateString = view.intervalStart.month()+'/'+view.intervalStart.year();
var curDateString = now.getMonth()+'/'+now.getFullYear();
var endDateString = end.getMonth()+'/'+end.getFullYear();
if (calDateString === curDateString) {
jQuery('.fc-prev-button').addClass("fc-state-disabled");
} else {
jQuery('.fc-prev-button').removeClass("fc-state-disabled");
}
if (endDateString === calDateString) {
jQuery('.fc-next-button').addClass("fc-state-disabled");
} else {
jQuery('.fc-next-button').removeClass("fc-state-disabled");
}
}