You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FullCalendar实现周视图时段选择后通过提交按钮发送数据

实现FullCalendar周视图的时段选择与提交需求

这个需求完全可以通过FullCalendar的API结合自定义逻辑实现,以下是具体的实现思路和代码示例:

1. 基础配置:周视图与时段设置

先初始化周视图,配置1小时时段间隔并开启选择功能:

document.addEventListener('DOMContentLoaded', function() {
  let selectedSlots = new Set(); // 用Set存储选中时段,自动去重
  const calendarEl = document.getElementById('calendar');

  const calendar = new FullCalendar.Calendar(calendarEl, {
    initialView: 'timeGridWeek',
    slotMinTime: '08:00:00', // 可选:设置时段起始时间
    slotMaxTime: '18:00:00', // 可选:设置时段结束时间
    slotDuration: '01:00:00', // 定义1小时的时段间隔
    selectable: true, // 允许点击选择时段
    selectMirror: true, // 选中时的临时视觉反馈
    // 处理时段选中/取消事件
    select: function(info) {
      const slotKey = `${info.startStr}-${info.endStr}`;
      if (selectedSlots.has(slotKey)) {
        // 取消选中:从集合移除并重新渲染状态
        selectedSlots.delete(slotKey);
      } else {
        // 添加选中:加入集合并渲染状态
        selectedSlots.add(slotKey);
      }
      renderSelectedSlots();
      calendar.unselect(); // 清除默认的选中高亮框
    },
    // 视图切换或日期变更时重新渲染选中状态
    datesSet: function() {
      renderSelectedSlots();
    }
  });

  calendar.render();

  // 渲染选中时段的背景色标识
  function renderSelectedSlots() {
    const events = Array.from(selectedSlots).map(key => {
      const [start, end] = key.split('-');
      return {
        start,
        end,
        display: 'background',
        backgroundColor: '#aaf0d1' // 自定义选中背景色
      };
    });
    // 先清空原有背景事件,再添加新的
    calendar.removeAllEventSources();
    calendar.addEventSource(events);
  }

  // 提交按钮的处理逻辑
  document.getElementById('submit-btn').addEventListener('click', function() {
    // 转换为后端需要的格式
    const submitData = Array.from(selectedSlots).map(key => {
      const [start, end] = key.split('-');
      return { start, end };
    });
    // 替换为实际的API请求
    console.log('提交的选中时段:', submitData);
    // fetch('/api/submit-slots', {
    //   method: 'POST',
    //   headers: { 'Content-Type': 'application/json' },
    //   body: JSON.stringify(submitData)
    // });
  });
});

2. 复选框标识的实现(可选)

如果需要给每个时段添加复选框,可通过slotLabelContent自定义时段标签:

// 在Calendar配置中添加
slotLabelContent: function(info) {
  const slotEnd = info.date.add(calendar.options.slotDuration);
  const slotKey = `${info.date.toISOString()}-${slotEnd.toISOString()}`;
  const isChecked = selectedSlots.has(slotKey);
  return {
    html: `<input type="checkbox" ${isChecked ? 'checked' : ''} 
            data-slot="${slotKey}"> ${info.text}`
  };
}

然后添加复选框的点击监听,同步选中状态:

// 在calendar.render()之后添加
calendarEl.addEventListener('change', function(e) {
  if (e.target.type === 'checkbox') {
    const slotKey = e.target.dataset.slot;
    e.target.checked ? selectedSlots.add(slotKey) : selectedSlots.delete(slotKey);
    renderSelectedSlots(); // 同步背景色标识
  }
});

3. 关键说明

  • 用Set存储选中时段的唯一标识(起始+结束时间字符串),避免重复选择
  • 通过背景事件display: 'background'实现选中状态的视觉标识,无需额外DOM操作
  • 复选框方式需要自定义slot内容,同时关联选中状态集合,保证交互一致性
  • 提交时将Set转换为数组,可根据后端需求调整数据格式

内容的提问来源于stack exchange,提问作者overtherain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:12:20