如何将evoCalendar jQuery插件集成到现有datepicker组件中
Hey there! 你想给现有的jQuery UI Datepicker加上类似evoCalendar的彩色事件标记对吧?其实这俩是独立的组件,没法直接把evoCalendar的功能"嵌"进Datepicker里,但有两个靠谱的方案:要么换成evoCalendar并适配你原来的配置,要么给当前的Datepicker自定义实现标记效果。下面详细说:
如果你打算改用evoCalendar,需要把原有的Datepicker代码替换掉,同时调整配置来匹配你之前的需求:
步骤1:准备evoCalendar资源
先确保你已经引入了evoCalendar的CSS和JS文件(本地资源或CDN都可以)
步骤2:替换HTML结构
把原来的#datepickerSessions元素替换成evoCalendar的容器:
<div id="evoCalendar"></div>
步骤3:适配原有配置并添加事件
根据你原Datepicker的参数,对应配置evoCalendar,同时添加你的事件:
// 转换minDate格式(evoCalendar支持"YYYY/MM/DD"或Date对象) const minDateObj = new Date(minDate); // 假设你的minDate是可解析的日期字符串/Date对象 const formattedMinDate = `${minDateObj.getFullYear()}/${minDateObj.getMonth()+1}/${minDateObj.getDate()}`; // 定义你的事件列表 const myEvents = [ { name: "New Year", date: "2020/01/01", type: "holiday", everyYear: true }, { name: "Valentine's Day", date: "2020/02/14", type: "holiday", everyYear: true }, { name: "Birthday", date: "2020/02/03", type: "birthday" }, { name: "Author's Birthday", date: "2020/02/15", type: "birthday", everyYear: true }, { name: "Holiday", date: "2020/02/15", type: "event" } ]; // 初始化evoCalendar,对应原Datepicker的配置 $('#evoCalendar').evoCalendar({ calendarEvents: myEvents, format: 'DD/MM/YYYY', // 匹配原dateFormat: 'dd/mm/yy' firstDayOfWeek: 1, // 匹配原firstDay: 1(周一作为一周第一天) minDate: formattedMinDate, // 设置最小日期 theme: 'Royal Navy' // 可选,根据喜好选主题 }); // 后续添加新事件的方式 $("#evoCalendar").evoCalendar('addCalendarEvent', [ { name: "NEW EVENT", date: "2020/02/16", type: "birthday", everyYear: true } ]);
注意:evoCalendar默认就是内嵌显示的,对应原Datepicker的
inline: true,不用额外配置;另外日期格式要统一成它支持的格式哦。
如果你不想替换组件,可以利用Datepicker的beforeShowDay回调+自定义CSS来实现类似效果,不用改动太多现有代码:
步骤1:定义事件数据
先整理你的事件,按日期分类,给不同类型设置对应颜色:
// 事件数据:key是日期(和Datepicker的dateFormat一致,比如"03/02/20"),value是事件类型和颜色 const dateEvents = { "01/01/20": { type: "holiday", color: "#ff4444" }, "14/02/20": { type: "holiday", color: "#ff4444" }, "03/02/20": { type: "birthday", color: "#99cc00" }, "15/02/20": [ { type: "birthday", color: "#99cc00" }, { type: "event", color: "#33b5e5" } ] // 支持单个日期多个事件 };
步骤2:修改Datepicker配置,添加beforeShowDay回调
在原有的Datepicker初始化代码里加入beforeShowDay,用来给有事件的日期标记class:
$('#datepickerSessions').datepicker({ dateFormat: 'dd/mm/yy', numberOfMonths: 1, minDate: minDate, inline: true, firstDay: 1, beforeShowDay: function(date) { // 把date转换成和dateEvents匹配的格式:dd/mm/yy const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); const year = String(date.getFullYear()).slice(-2); const dateStr = `${day}/${month}/${year}`; const events = dateEvents[dateStr]; if (events) { // 给有事件的日期加自定义class let className = 'has-event'; // 如果是多个事件,额外加class区分 if (Array.isArray(events)) className += ' multi-event'; // 第三个参数是hover时的提示文本 const tooltipText = Array.isArray(events) ? events.map(e => e.type + ': ' + e.name).join('\n') : events.type + ': ' + events.name; return [true, className, tooltipText]; } return [true, '', '']; } });
步骤3:添加自定义CSS显示彩色圆点
根据上面的class,编写CSS样式实现彩色圆点:
/* 单个事件的圆点 */ .ui-datepicker td.has-event::after { content: ''; position: absolute; bottom: 2px; left: 50%; transform: translateX(-50%); width: 6px; height: 6px; border-radius: 50%; background-color: #ff4444; /* 默认事件颜色 */ } /* 多个事件的多色圆点 */ .ui-datepicker td.has-event.multi-event { position: relative; } .ui-datepicker td.has-event.multi-event::before, .ui-datepicker td.has-event.multi-event::after { content: ''; position: absolute; bottom: 2px; width: 6px; height: 6px; border-radius: 50%; } .ui-datepicker td.has-event.multi-event::before { left: calc(50% - 4px); background-color: #99cc00; /* 第一个事件颜色 */ } .ui-datepicker td.has-event.multi-event::after { left: calc(50% + 4px); background-color: #33b5e5; /* 第二个事件颜色 */ }
如果需要支持更多事件,你可以扩展CSS或者动态生成样式,灵活度很高。
总结一下:如果想要快速实现evoCalendar的现成效果,就直接替换组件并适配配置;如果想保留现有Datepicker的功能和样式,就用自定义回调+CSS的方式实现标记。
内容的提问来源于stack exchange,提问作者proera

