FullCalendar scheduler:eventDragStop仅同时间拖拽触发的实现咨询
FullCalendar Scheduler 拖拽事件仅在同时间执行操作的解决方案
要实现eventDragStop仅在事件被拖拽到同一日期时间时执行逻辑,核心是对比拖拽前后的事件时间状态。由于eventDragStop回调中的event对象已是拖拽后的更新状态,需要提前在拖拽开始时保存原始时间数据,再在结束时做对比判断。
实现步骤
- 声明全局变量存储事件的原始时间信息
- 在
eventDragStart回调中保存拖拽前的事件开始/结束时间 - 在
eventDragStop回调中对比原始时间与拖拽后的时间,确认未变化后再执行目标逻辑
代码示例
// 全局变量存储原始事件时间数据 let originalEventInfo = {}; // 拖拽开始时保存原始时间戳 eventDragStart: function(event, jsEvent, ui, view) { // 用时间戳存储,避免时区或对象引用导致的对比误差 originalEventInfo.startTimestamp = event.start.valueOf(); originalEventInfo.endTimestamp = event.end ? event.end.valueOf() : null; }, eventDragStop: function(event, jsEvent, ui, view) { // 获取拖拽后的时间戳 const newStartTimestamp = event.start.valueOf(); const newEndTimestamp = event.end ? event.end.valueOf() : null; // 对比原始与新的时间戳,判断是否为同一时间 const isSameDateTime = originalEventInfo.startTimestamp === newStartTimestamp && originalEventInfo.endTimestamp === newEndTimestamp; if (isSameDateTime) { // 仅当时间未变化时执行你的业务逻辑 console.log("事件未改变时间,执行操作"); // 这里写入需要执行的代码... } else { // 时间已变化,不执行任何操作 return; } }
补充说明
- 如果需要更精细的时间对比(比如忽略秒数,只精确到分钟),可以利用FullCalendar内置的Moment.js工具:
在eventDragStart中存储原始Moment对象:
然后在eventDragStart: function(event, jsEvent, ui, view) { originalEventInfo.start = event.start.clone(); originalEventInfo.end = event.end ? event.end.clone() : null; }eventDragStop中做精度对比:const isSameStart = originalEventInfo.start.isSame(event.start, 'minute'); const isSameEnd = !originalEventInfo.end && !event.end || (originalEventInfo.end && originalEventInfo.end.isSame(event.end, 'minute')); if (isSameStart && isSameEnd) { // 执行目标逻辑 } - 若涉及时区切换,建议统一转成UTC时间戳再对比,避免时区差异导致的判断错误。
内容的提问来源于stack exchange,提问作者user2029505
相关产品推荐
相关产品推荐

