【套件筆記 - JS】時間選擇器 flatpickr.js

更新於 發佈於 閱讀時間約 9 分鐘

不喜歡 HTML 原生的時間選擇器外型嗎?試試看 flatpickr 吧!

以下是使用 flatpickr 做簡單的示例,以及 flatpickr 使用注意事項。

Demo

Demo

一、官網資源

flatpickr 官網:https://flatpickr.js.org/


二、CDN 安裝

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/bootstrap@5.3.2/dist/css/bootstrap.min.css">


三、使用範例

https://codepen.io/annchou_illu/pen/oNmZbBX

3-1. 目標功能

  1. 時間輸入格須具備點選 年/月/日/時/分
  2. 時間輸入格採 24 時制
  3. 開始時間不能早於當前本地時間
  4. 結束時間只能選擇當前一個月內的本地時間
  5. 時間輸入格的開始時間不能晚於結束時間

3-2. 示範步驟

  1. 規劃版位
  2. DOM 元素綁定
  3. flatpickr 初始化
  4. 判斷時間先後順序,提示錯誤警告

3-3. 實作

  1. 規劃版位 HTML
    寫入開始與結束日期輸入格,以及錯誤訊息提示,並將錯誤訊息先使用 d-none (Bootstrap 樣式)隱藏。
    input 時間 type 的寫法請參考 MDN,我們在這裡新增一個 dateSelector 的 class 在兩個時間輸入格上,這待會可以用來做 flatpicr 初始化綁定。其實 flatpicr 綁 id 也可以,但因為 id 必須是唯一值,class 可以重複,所以綁 class 比較單純。
    目前已經可以使用 HTML 原生的選擇器了。
<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>
原生 HTML 選擇器

原生 HTML 選擇器

  1. DOM 元素綁定
    綁定錯誤訊息提示。
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);
  1. 測試是否能取值
    我們也能利用 flatpickr 做 onChange 監聽,做些執行動作。在 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 展開可以在其中找到 inputinput.id 可用來判斷目前正被點選的 DOM
onChange: function (selectedDates, dateStr, instance) {
console.log(`你現在點選的是 ${instance.input.id},時間為 ${selectedDates} / ${dateStr}`);
}
Demo

Demo

  1. 上面步驟有提到 instance.input.id 可以用作判斷正被點選的 DOM,所以我們改寫 onChange,讓它能將參數傳輸,引發能辨別時間先後的函式執行
onChange: function (selectedDates, dateStr, instance) {
checkDateTime(dateStr, instance.input.id);
}
  1. 辨別兩時間先後
    因為每次 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");
}

}
  1. 以上即完成所有項目


四、flatpickr 注意事項

  1. 可使用 flatpickr("input[type=datetime-local]", config); 綁定,但 MDN 表示 type="datetime-local" 在少數瀏覽器中會降階為 type="text",所以還是建議使用 class 或 id 綁定會比較好。
  2. 部分設置如限制可選時間、每次可選時間間隔的設定,因為手機會變成使用每個系統原生的選擇器,所以將造成可用手機原生選擇器選擇被限制的時間,但在手機畫面顯示時會產生錯誤。
  3. 如果要將 A input 的時間傳遞至 B input 顯示,需於使用 flatpickr 綁定的 B input 使用 setDate(時間, true),否則在手機版無法顯示。
留言
avatar-img
留言分享你的想法!
avatar-img
Ann Chou的沙龍
17會員
29內容數
從藝術領域轉職到前端工程師,喜歡書寫學習歷程和技術文件,掌握經驗與隨時提取的感覺很好。
Ann Chou的沙龍的其他內容
2024/04/08
Swiper.js 是一個功能齊全的輪播套件,除了輪播外,也可以客製化導航按鈕和頁碼等細項。目前支持 JS、React、Vue。但是 Swiper.js Vue 版本主要由 Composition API 風格構成,此篇文章將介紹 Options API 的撰寫方式,以及如何做樣式客製化。
Thumbnail
2024/04/08
Swiper.js 是一個功能齊全的輪播套件,除了輪播外,也可以客製化導航按鈕和頁碼等細項。目前支持 JS、React、Vue。但是 Swiper.js Vue 版本主要由 Composition API 風格構成,此篇文章將介紹 Options API 的撰寫方式,以及如何做樣式客製化。
Thumbnail
2024/02/18
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
2024/02/18
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
2024/02/18
分享這套功能齊全,視覺超級可愛還有響應式變化,教學文件又很容易閱讀的套件 Evo Calendar。 當初在製作 JS side project 時,想找一個與 VCalendar 視覺相近的套件,但多半都不合意。六角學院指派的 side project 教練也幫我找了另一個純 JS 的範例,也很
Thumbnail
2024/02/18
分享這套功能齊全,視覺超級可愛還有響應式變化,教學文件又很容易閱讀的套件 Evo Calendar。 當初在製作 JS side project 時,想找一個與 VCalendar 視覺相近的套件,但多半都不合意。六角學院指派的 side project 教練也幫我找了另一個純 JS 的範例,也很
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
JavaScript30 傳送門:https://javascript30.com/ 今天才發現可以不用看著影片一步一步寫,可以自己先寫寫看😛 第二個挑戰是用 JS + CSS 寫一個時鐘,不過其實檔案裡面 HTML 跟 CSS 都已經寫好了,三個指針也都放好了,Go Live 起來就長
Thumbnail
JavaScript30 傳送門:https://javascript30.com/ 今天才發現可以不用看著影片一步一步寫,可以自己先寫寫看😛 第二個挑戰是用 JS + CSS 寫一個時鐘,不過其實檔案裡面 HTML 跟 CSS 都已經寫好了,三個指針也都放好了,Go Live 起來就長
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
不喜歡 HTML 原生的時間選擇器外型嗎?試試看 flatpickr.js 吧! 以下是使用 flatpickr 做簡單的示例,以及 flatpickr 使用注意事項。
Thumbnail
不喜歡 HTML 原生的時間選擇器外型嗎?試試看 flatpickr.js 吧! 以下是使用 flatpickr 做簡單的示例,以及 flatpickr 使用注意事項。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News