已实现每周重复,如何用fullCalendar.js实现交替周重复事件?
实现fullCalendar交替周重复事件的可行方案
嘿,我来帮你搞定fullCalendar的交替周重复事件需求!fullCalendar本身没有内置的“隔周重复”配置项,但我们有两种靠谱的实现方式,都能完美达成你的需求:
方法一:动态生成事件(推荐)
这种方式通过events回调函数,根据当前视图的日期范围,主动计算出符合交替周条件的日期,生成对应的事件对象,逻辑清晰且性能友好。
$('#calendar').fullCalendar({ defaultDate: moment(), header: { left: 'prev,next today', center: 'title', right: 'month,agendaWeek,agendaDay' }, defaultView: 'month', events: function(start, end, timezone, callback) { const events = []; // 定义要重复的星期几:1=周一,4=周四 const targetWeekdays = [1, 4]; // 设定交替规则:这里是奇数周(第1、3、5...周)重复,改成0就是偶数周 const targetWeekMod = 1; let currentDate = moment(start); // 遍历视图覆盖的所有日期 while (currentDate.isBefore(end)) { const dayOfWeek = currentDate.isoWeekday(); const weekNumber = currentDate.isoWeek(); // 同时满足「目标星期几」和「交替周条件」时,添加事件 if (targetWeekdays.includes(dayOfWeek) && weekNumber % 2 === targetWeekMod) { events.push({ title: "My alternating weekly event", start: currentDate.clone().set({ hour: 10, minute: 0 }), end: currentDate.clone().set({ hour: 14, minute: 0 }), allDay: false }); } currentDate.add(1, 'day'); } callback(events); } });
关键说明:
- 用
isoWeek()获取ISO标准周数(国际通用,每年第一周至少含4天在当年),如果需要适配本地周规则,换成week()即可 - 调整
targetWeekMod的值(0或1),就能切换是偶数周还是奇数周重复 - 如果需要从某个特定日期开始计算交替周,可以在
weekNumber的基础上减去起始日期的周数,再取余判断
方法二:用eventRender过滤事件
如果你想保留原有的事件定义方式,也可以通过eventRender回调拦截渲染,只显示符合交替周条件的事件:
$('#calendar').fullCalendar({ defaultDate: moment(), header: { left: 'prev,next today', center: 'title', right: 'month,agendaWeek,agendaDay' }, defaultView: 'month', events: [{ title: "My repeating event", start: '10:00', end: '14:00', dow: [1, 4] }], eventRender: function(event, element, view) { const eventWeek = moment(event.start).isoWeek(); // 同样设定奇数周显示,偶数周隐藏 const targetWeekMod = 1; // 不符合条件则阻止渲染 return eventWeek % 2 === targetWeekMod; } });
关键说明:
- 这种方式保留了原有的
dow重复规则,只是在渲染阶段过滤掉不符合交替周的事件 - 逻辑更轻量,但如果视图范围内事件较多,性能略逊于动态生成的方式
内容的提问来源于stack exchange,提问作者user3202086
相关产品推荐
相关产品推荐

