jQuery UI : DatePicker
表單第四篇,我們來終於來到日期選擇器(DataPicker)。
在表單上最容易產生的錯誤就是「輸入錯誤」,例如,我們網站裡的客戶註冊資料,明明就已經設計電子郵件必須輸入兩次,而且兩次必須完全相同才能通過驗證,還是會有客戶發 Mail 來說:「對不起,我 Email 輸入錯誤,請幫我修正資料。」一整個 Orz!
所以能「勾勾、選選」是最好的選擇,最少能減低這類的「輸入錯誤」。其中「日期」的輸入通常都是很重要,註冊日期、購買日期、出貨日期、銷售日期、保固日期、發佈日期、LogOn-LogOut日期…等。
前面介紹的 HTML 編輯器,是美化你輸入的資料。有時"日期"就重要性而言,會比內容更為重要。我們希望減少日期的輸入錯誤,但一個字一個字打,日期的錯誤率就硬是比Email這類資料還高。
所以就出現「用選的」這類需求。就有人開發出 DatePicker,讓使用者可以很方便,用選的,幾年幾月幾日,一整個就是爽。不管是 UI、Usability … DatePicker 與 HTML Editor 都是加分部分。
前面準備一樣,Model、Controller \ Action、View。
Model:BlogPostjQueryUI.vb
Controller \ Action:BlogPostjQueryUIController.vb
建置,用強型別新增View。
View:Create.aspx
Imports System.ComponentModel.DataAnnotations
''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostjQueryUI
' 標題
Public Property Title() As String
' 發佈日期
<DataType(DataType.Date)>
Public Property PostedOn() As DateTime
' 標籤
Public Property Tags() As String
' 內容
Public Property Content() As String
End Class
Controller \ Action:BlogPostjQueryUIController.vb
Namespace Mvc3HTMLEditorAndDatePicker
Public Class BlogPostjQueryUIController
Inherits System.Web.Mvc.Controller
'
' GET: /BlogPostjQueryUI/Create
Function Create() As ActionResult
Return View()
End Function
<HttpPost(), ActionName("Create")>
Function Create_Post(model As BlogPostjQueryUI) As ActionResult
ViewBag.HtmlContent = model.Content
Return View(model)
End Function
End Class
End Namespace
建置,用強型別新增View。
View:Create.aspx
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostjQueryUI)" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
KKBruce : DatePicker (使用jQuery UI) 日期選擇器測試
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>DatePicker (使用jQuery UI) 日期選擇器測試</h2>
<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>
<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>
<% Using Html.BeginForm() %>
<%: Html.ValidationSummary(True) %>
<fieldset>
<legend>jQuery UI 日期選擇器測試</legend>
<div class="editor-label">
<%: Html.LabelFor(Function(model) model.Title) %>
</div>
<div class="editor-field">
<%: Html.EditorFor(Function(model) model.Title) %>
<%: Html.ValidationMessageFor(Function(model) model.Title) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(Function(model) model.PostedOn) %>
</div>
<div class="editor-field">
<%: Html.EditorFor(Function(model) model.PostedOn) %>
<%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(Function(model) model.Tags) %>
</div>
<div class="editor-field">
<%: Html.EditorFor(Function(model) model.Tags) %>
<%: Html.ValidationMessageFor(Function(model) model.Tags) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(Function(model) model.Content) %>
</div>
<div class="editor-field">
<%: Html.EditorFor(Function(model) model.Content) %>
<%: Html.ValidationMessageFor(Function(model) model.Content) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% End Using %>
<div>
<%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>
</asp:Content>
日期選擇器( DatePicker ) 第一個我們來介紹最簡易入門的 jQuery UI。
設定與使用 jQuery UI - DatePicker
jQuery 與 jQuery UI,其實都已經內建於 ASP.NET MVC 3 之中,你可以查看 Scripts 目錄之下,以我原生的 ASP.NET MVC 3 專案下,已經有 jquery-1.5.1.min.js 與 jquery-ui-1.8.11.min.js。
預設在 Site.Master 中有引用 jquery-1.5.1.min.js,但是沒有引用 jquery-ui-1.8.11.min.js,讓我們在Create.aspx 裡引用 jquery-ui-1.8.11.min.js 及寫一點點程式碼,以使用 jQuery UI 的 DatePicker 功能。
<!-- jQuery UI -->
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.min.js") %>" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$('#PostedOn').datepicker();
});
</script>
建置,把網頁執行起來,然後輸入「http://localhost:6944/BlogPostjQueryUI/Create」(記得Port要換成你的)。
![]() |
| 圖一:jQuery UI - DatePicker |
<!-- jQuery UI -->
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.min.js") %>" type="text/javascript"></script>
<link href="<%: Url.Content("~/Content/themes/base/jquery.ui.all.css") %>" rel="stylesheet" type="text/css" />
<link href="<%: Url.Content("~/Content/themes/base/jquery.ui.datepicker.css") %>" rel="stylesheet" type="text/css" />
<script type="text/javascript">
$(function () {
$('#PostedOn').datepicker();
});
</script>
我們必須引用兩個 CSS 檔案:jquery.ui.all.css 與 jquery.ui.datepicker.css。引用後,重新執行網頁。
![]() |
| 圖二:jQuery UI - DatePicker with CSS |
<script type="text/javascript">
$(function () {
// $('#PostedOn').datepicker();
// 指定台灣習慣日期格式,例如,2011/9/23
$("#PostedOn").datepicker({ dateFormat: "yy/mm/dd" });
});
</script>
設定為日期格式為「年/月/日」。重新執行網頁。
![]() |
| 圖三:jQuery UI - DatePicker 台灣日期格式 |
注意,指定日期格式裡的 yy 只有兩碼,如果你打成 "yyyy/mm/dd",那你會得到「20112011/10/05」這個非日期內容。
到這裡,日期選擇器已經 100% 完成了。
大小決定速度
讓我再更進階一些討論 DatePicker。jQuery UI 就 jquery-ui-1.8.11.min.js 此版本大小為 213 KB,未壓縮 368 KB。jQuery UI 本身是個強大 UI Framework,如果只是拿來做 DatePicker 功能,只寫一行程式碼,確要花費 213 KB ~ 368 KB 的頻寬資源,實在不太好。
讓我們再次打開 NuGet,搜尋 datepicker,
![]() |
| 圖四:NuGet - jQuery UI Widgets: Datepicker |
- jquery.ui.core.js
- jquery.ui.core.min.js ( 5 KB )
- jquery.ui.datepicker.js
- jquery.ui.datepicker.min.js ( 35 KB )
213 KB VS 40 KB,結果很明顯了,jQuery UI Widgets : Datepicker "Win".
修改我們載入 Scripts:
<!-- jQuery UI -->
<!--
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.min.js") %>" type="text/javascript"></script>
-->
<!-- 使用jQuery UI Widgets : Datepicker -->
<script src="<%: Url.Content("~/Scripts/jquery.ui.core.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.ui.datepicker.min.js") %>" type="text/javascript"></script>
<link href="<%: Url.Content("~/Content/themes/base/jquery.ui.all.css") %>" rel="stylesheet" type="text/css" />
<link href="<%: Url.Content("~/Content/themes/base/jquery.ui.datepicker.css") %>" rel="stylesheet" type="text/css" />
<script type="text/javascript">
$(function () {
// $('#PostedOn').datepicker();
// 指定台灣習慣日期格式,例如,2011/9/23
$("#PostedOn").datepicker({ dateFormat: "yy/mm/dd" });
});
</script>
重新執行網頁,一切運作正常。Very Good。
版本呀!版本!
還有呀,對,還沒寫完,你以為簡單的東西,越不簡單。讓我們先把 jQuery UI Widgets : Datepicker 移除。回復到使用 jquery-ui-1.8.11.min.js 情況。我現在要模擬一個很常見的情況。像 jQuery 更新的速度很快,我們在開發一個專案期間,可能 jQuery 已經更新了三次。除非是特別版本,那種更新後會讓你的 jQuery 不會運作的版本,通常,三天到一週內,此特別版就被判死刑。我們會等個幾天或一到二週,然後把專案裡的 jQuery (或其他 Scripts) 做更新。
讓我們再打開 NuGet,更新目前所有內建 Scripts 至最新版本 ( 目前最新為 jQuery 1.6.4 )。
![]() |
| 圖五:更新 jQuery 至 1.6.4 版本 |
![]() |
| 圖六:Installing : Operation failed. |
Attempting to resolve dependency 'jQuery (≥ 1.4.4 && < 1.6)'. Successfully installed 'jQuery 1.4.4'. Successfully installed 'jQuery.UI.Core 1.8.9'. Successfully installed 'jQuery.UI.Widgets.Datepicker 1.8.9'. Install failed. Rolling back... Already referencing a newer version of 'jQuery'.
好笑吧,我們反而給最新版本害到,還跟我說「是否已經是最新版的 jQuery」?。那怎麼辦?
自訂 jQuery UI Library
我們也不要太依賴工具,工具好用是不錯,但過度依賴就不是件好事。這種事,已經碰到很多次了。讓我們上 jQuery UI 官網 → Download:
![]() |
| 圖七:jQuery UI 自訂下載 (點程看大圖) |
- UI Core:勾選 Core
- Widgets:勾選 Datepicker
然後按「Download」下載我們自訂選擇好的 jQuery UI Library,目前我下載到的是 jquery-ui-1.8.16.custom.zip,解壓縮後,點擊 index.html , 裡面有一個簡易範例,我們查看一下它的 Source Code,發現它是載入一個「css/ui-lightness/jquery-ui-1.8.16.custom.css」與「js/jquery-ui-1.8.16.custom.min.js」就可以運作。
複製步驟:
- 把 css/ui-lightness/jquery-ui-1.8.16.custom.css 複製到專案 Content 目錄之下。
- 把 css/ui-lightness/images 的圖檔複製到專案 Content\images 目錄之下。
- 把 js/jquery-ui-1.8.16.custom.min.js 複製到 Scripts 目錄之下。
更新 Site.Master 使用 jQuery 1.6.4,然後在我們 Create.aspx 引用我們新下載的 jquery-ui-1.8.16.custom.css 與 jquery-ui-1.8.16.custom.min.js。
<!-- 使用自訂 jQuery UI -->
<link href="<%: Url.Content("~/Content/jquery-ui-1.8.16.custom.css") %>" rel="stylesheet" type="text/css" />
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.16.custom.min.js") %>" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
// $('#PostedOn').datepicker();
// 指定台灣習慣日期格式,例如,2011/9/23
$("#PostedOn").datepicker({ dateFormat: "yy/mm/dd" });
});
</script>
建置,重新執行網頁,我們能看到 jQuery 1.6.4 與 jquery-ui-1.8.16.custom.min.js 合作的很好。
語系呀,語系
「媽媽咪呀!你~你~你,寫夠了沒?」訪客說。關於 jQuery UI : Datepicker 最後有個寶藏。我們最後自訂下載回來的 jquery-ui-1.8.16.custom.zip 解壓縮後,裡面有三個目錄,前面用了兩個,第三個就是寶藏。它的名字叫「Development-bundle ( 開發包 )」,裡面有更進階關於 jQuery UI : Datepicker 的相關資源。
「最後,保證最後了。」KKBruce 說。
- demo : 相關範例程式。
- docs:相關文件。
- external:延伸的 JavaScript。
- themes:樣版。
- ui:介面相關 JavaScript。
在「Development-bundle\ui\i18n\」之下,你能找到各語系資源檔案,只需要把你想要使用語系 *.js 引用到 Datepicker 頁面即可,Datepicker 頁面會自動切換為你所引用的語系介面。先複製 jquery.ui.datepicker-zh-TW.js 到專案 Scripts ,然後引用「jquery.ui.datepicker-zh-TW.js」這支語系資源檔。
<!-- 使用自訂 jQuery UI -->
<link href="<%: Url.Content("~/Content/jquery-ui-1.8.16.custom.css") %>" rel="stylesheet" type="text/css" />
<script src="<%: Url.Content("~/Scripts/jquery-ui-1.8.16.custom.min.js") %>" type="text/javascript"></script>
<!-- 使用 Taiwan 語系 -->
<script src="<%: Url.Content("~/Scripts/jquery.ui.datepicker-zh-TW.js") %>" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
// $('#PostedOn').datepicker();
// 指定台灣習慣日期格式,例如,2011/9/23
$("#PostedOn").datepicker({ dateFormat: "yy/mm/dd" });
});
</script>
建置,重新執行網頁。
![]() |
| 圖八:jQuery UI : Datepicker 正體中文語系 |
可以,不過我不寫了,答案就在 Development-bundle 之中。
jQuery UI : Datepicker 使用心得
jQuery UI 不愧是 jQuery 的分支,和 jQuery 有一樣的特色「寫的更少,做的更多。」,簡單、強大、靈活、彈性。當然,我們只是拿它來玩 Datepicker 功能,真的是大巫小用。我覺得它有點像「斯斯」,什麼都可以醫,只有單一症狀時,拿它來吃好像有點浪費。但當你所有症狀都出現時,拿它來吃,你就會覺得它是仙丹!(這是什麼爛比喻!爛!爛!爛!)
參考資料
- 官網:jQuery UI
- 官網 Datepicker Demo:jQuery UI : Demo Datepicker








我個人超討厭 jQuery UI 的覺得他實在太肥大了
回覆刪除^_^
回覆刪除Demo 大大
後面還有兩篇,再請指教。
請問 KKBruce 大大,我想在同一頁面放兩個日期選擇器,這該如何做呢?
回覆刪除請參考jQuery語法,取得對應欄位在設定即可。
刪除