分享這套功能齊全,視覺超級可愛還有響應式變化,教學文件又很容易閱讀的套件 Evo Calendar。
當初在製作 JS side project 時,想找一個與 VCalendar 視覺相近的套件,但多半都不合意。六角學院指派的 side project 教練也幫我找了另一個純 JS 的範例,也很接近 VCalendar,但我實在改不動它的 JS,專題完成時間有限,所以最後仍選擇使用套件製作專題。
evocalendar 官網:https://edlynvillegas.github.io/evo-calendar/
需搭配 jQuery 使用
<!-- 月曆 evo-calendar -->
<script src="https://www.jsdelivr.com/package/npm/evo-calendar"></script>
<!-- Add jQuery library (required) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
<!-- Add the evo-calendar.js for.. obviously, functionality! -->
<script src="https://cdn.jsdelivr.net/npm/evo-calendar@1.1.2/evo-calendar/js/evo-calendar.min.js"></script>
https://codepen.io/annchou_illu/pen/MWLrNqw
<div class="container">
<!-- 表格區 -->
<form class="form">
<div>
<label for="name">活動標題</label>
<input type="text" placeholder="活動標題" class="event-input">
</div>
<div>
<label for="startDate">開始時間</label>
<input type="date" class="event-input">
</div>
<div>
<label for="endDate">結束時間</label>
<input type="date" class="event-input">
</div>
<div>
<label for="type">活動類型</label>
<select name="type" id="type" class="event-input">
<option value="">--Please choose an option--</option>
<option value="event">event</option>
<option value="holiday">holiday</option>
</select>
</div>
<div>
<label for="everyYear">是否每年重覆</label>
<select name="everyYear" id="everyYear" class="event-input">
<option value="">--Please choose an option--</option>
<option value="yes">yes</option>
<option value="no">no</option>
</select>
</div>
<div>
<label for="describe">敘述</label>
<textarea name="describe" id="describe" cols="20" rows="10" class="event-input"></textarea>
</div>
<button type="button" class="addEvent">送出</button>
</form>
<!-- 月曆渲染區 -->
<div id="calendar" style="width:600px"></div>
</div>
const events = [
{
id: "E001",
name: "看牙醫",
description: "記得先刷牙",
date: "2023/12/05",
type: "event",
everyYear: false
},
...略
];
$('#calendar').evoCalendar({
settingName: settingValue
})
$("#calendar")
.evoCalendar({
format: "yyyy/mm/dd", //時間格式
todayHighlight: true, //標註今天
sidebarDisplayDefault: false, //左側月份預設顯示狀態
eventDisplayDefault: false, //右側事件預設顯示狀態
calendarEvents: events //傳入套件的事件來源
})
// 綁定送出按鈕
const btnAddEvent = document.querySelector(".addEvent");
// 綁定所有輸入格
const eventInput = document.querySelectorAll(".event-input");
// 綁定表單
const form = document.querySelector(".form");
// 當送出按鈕按下,觸發 addEvent 函式
btnAddEvent.addEventListener("click", addEvent);
function addEvent(){}
function addEvent
function addEvent() {
// 取得輸入格資料
const data = {
id: new Date().getTime(), // 因為 id 是唯一值,直接用日期當作唯一值
name: eventInput[0].value,
description: eventInput[5].value,
date: [eventInput[1].value, eventInput[2].value],
type: eventInput[3].value,
everyYear: eventInput[4].value === "yes" ? true : false
};
// 測試印出要新增的資料,看是否符合格式
console.log(data);
// 在月曆上新增事件
$("#calendar").evoCalendar("addCalendarEvent", data);
// 執行月曆初始化
$("#calendar").evoCalendar();
// 清除表單,因為我的表格在 HTML 中最外層有使用 form 包裹,才能使用這個辦法
form.reset();
}
function checkFormError
,它的職責是驗證每個輸入格均有填寫,如果有內容為 ""
空字串,則變更變數 isFilledForm
的狀態,使用 alert
提醒,並返回結果給 function addEvent
。function addEvent
內部最前面則加入執行驗證的程式碼,如果有未填欄位則使用 return
中斷函式執行。function addEvent() {
// 有未填欄位就跳出
if (!checkFormError()) {
return;
}
const data = ...略
}
// 確認表格必填
function checkFormError() {
let isFilledForm = true;
eventInput.forEach((item) => {
if (item.value.trim() === "") {
isFilledForm = false;
}
});
alert("欄位均須填寫");
return isFilledForm;
}
$("#calendar")
.evoCalendar({
...略
})
.on("selectEvent", function (event, activeEvent) {
// 點擊月曆右側的事件列才會觸發
console.log("你選擇的事件是", event);
})
.on("selectDate", function (event, activeDate) {
// 點擊月曆日期會觸發
console.log(
"你選擇的事件 id 是",
event.target.evoCalendar.$active.events[0].id
);
console.log(`你選擇的日期是:${activeDate}`);
})
.on("selectMonth", function (event, activeMonth) {
// 點擊月曆月份會觸發
console.log(`你選擇的月份是:${activeMonth}`);
});