不喜歡 HTML 原生的時間選擇器外型嗎?試試看 flatpickr 吧!
以下是使用 flatpickr 做簡單的示例,以及 flatpickr 使用注意事項。
flatpickr 官網:https://flatpickr.js.org/
flatpickr
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
Bootstrap CSS(建立表單用,非必要)
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
https://codepen.io/annchou_illu/pen/oNmZbBX
HTML
d-none
(Bootstrap 樣式)隱藏。dateSelector
的 class 在兩個時間輸入格上,這待會可以用來做 flatpicr 初始化綁定。其實 flatpicr 綁 id 也可以,但因為 id 必須是唯一值,class 可以重複,所以綁 class 比較單純。<ul class="d-flex flex-column gap-3 p-5 border border-2 w-50 list-unstyled">
<li>
<label for="startDate" class="mb-16 mb-md-12">開始日期</label>
<input type="datetime-local" id="startDate" name="startDate" placeholder="請點選日期" class="dateSelector">
</li>
<li>
<label for="endDate" class="mb-16 mb-md-12">結束日期</label>
<input type="datetime-local" id="endDate" name="endDate" placeholder="請點選日期" class="dateSelector">
<p class="mt-3 text-danger d-none dateAlert">※ 結束日期須晚於開始日期</p>
</li>
</ul>
const dateAlert = document.querySelector(".dateAlert");
3. 設定 flatpicr 初始化
注意 MDN 說明提到 type="datetime-local"
在部分瀏覽器會自動轉成 type="text"
,所以建議綁 id 或是 class 比較安全。
更多說明:初始化方式、初始化屬性設定
因為這個範例是未使用 moment 的範例,所以我們需要藉由 Date 處理。
const currentTime = new Date()
config = {
enableTime: true, //可選時與分
dateFormat: "Y/m/d H:i", //時間格式
time_24hr: true, //24 時制
minuteIncrement: 15, //分鐘每次選擇間隔單位
allowInput: true, //可輸入控制
minDate: "today", //可選最小時間,可直接接受 'today' 字串
maxDate: currentTime.setMonth(currentTime.getMonth() + 1), //可選最大時間,從今天起一個月
}
flatpickr(".dateSelector", config);
config
中加入以下程式碼,傳入的三個值依序代表selectedDate
:相當 Date.prototype.toString()
,返回的字串 "Sun Dec 24 2023 03:00:00 GMT+0800 (台北標準時間)"dateStr
:返回字串 "2023/12/24 03:00",格式是剛才我們在 config
中設定的 dateFormat
instance
:flatpickr 實例,如果用 console.dir
展開可以在其中找到 input
,input.id
可用來判斷目前正被點選的 DOMonChange: function (selectedDates, dateStr, instance) {
console.log(`你現在點選的是 ${instance.input.id},時間為 ${selectedDates} / ${dateStr}`);
}
onChange: function (selectedDates, dateStr, instance) {
checkDateTime(dateStr, instance.input.id);
}
onChange
觸發,checkDateTime
都會跑一次,所以要先把開始日期和結束日期宣告在外面當全域變數。我們即可以使用比較運算子來判斷開始日期是否晚於結束日期。如果開始日期較晚,則移除錯誤訊息的 d-none
,讓錯誤訊息顯示。let startDateValue = null
let endDateValue = null
function checkDateTime(dateStr, id) {
if (id === "startDate"){
startDateValue = dateStr
}
if (id === "endDate"){
endDateValue = dateStr
}
if (startDateValue>endDateValue){
dateAlert.classList.remove("d-none");
}else{
dateAlert.classList.add("d-none");
}
}
flatpickr("input[type=datetime-local]", config);
綁定,但 MDN 表示 type="datetime-local"
在少數瀏覽器中會降階為 type="text"
,所以還是建議使用 class 或 id 綁定會比較好。