在Web開發中,總會遇到須要用戶輸入日期的狀況。通常都是提供一個text類型的input供用戶輸入日期。然而,這種方式,開發人員必須對用戶輸入的日期進行驗證,判斷其合法性。除此以外,用戶輸入日期也是一件不爽的事,若是用戶能夠直接選擇日期,這兩個問題都解決了。聽起來很不錯。實際上,不少開發者都是這麼作的。
咱們能夠本身用javascript寫一個日期選擇控件,然而,想要寫的很好、很漂亮卻須要花很多時間和精力。jQuery有一個UI插件:datepicher,能夠幫咱們實現該功能,並且界面很漂亮。下面就學學如何使用它吧。
datepicher插件是jQuery UI的一個插件,它提供一個日期彈出窗口(或直接顯示在頁面),供用戶選擇日期。
datepicher插件的使用很簡單,語法以下:javascript
$("#regDate").datepicher(optional);
其中optional是一個對象,該對象的每個屬性及含義能夠參看官方文檔:http://jqueryui.com/demos/datepicker/。在此,僅介紹一些經常使用的屬性。
一、datepicher最簡單的使用
Javascript代碼 css
$("#regDate").datepicher();
其中,regDate是頁面日期輸入框的ID屬性值。
就這一句話,在日期輸入框得到焦點時,就會彈出一個日期選擇窗口。然而,這時候的日期選擇窗口有不少不方便的地方,好比:只能一個月一個月的往前或日後,沒有關閉按鈕等。
二、配置datepicher
經過給datepicher設置一些屬性值能夠改變默認的顯示。如:html
$("#regDate").datepicker( { showMonthAfterYear: true, // 月在年以後顯示 changeMonth: true, // 容許選擇月份 changeYear: true, // 容許選擇年份 dateFormat:'yy-mm-dd', // 設置日期格式 closeText:'關閉', // 只有showButtonPanel: true纔會顯示出來 duration: 'fast', showAnim:'fadeIn', showOn:'button', // 在輸入框旁邊顯示按鈕觸發,默認爲:focus。還能夠設置爲both buttonImage: 'images/commons/calendar.gif', // 按鈕圖標 buttonImageOnly: true, // 不把圖標顯示在按鈕上,即去掉按鈕 buttonText:'選擇日期', showButtonPanel: true, showOtherMonths: true, //appendText: '(yyyy-mm-dd)', });
這個時候的日期選擇就很方便了。能夠自由選擇年份和月份。
三、增長清除按鈕和日期判斷功能(加強版datepicher1.7.2)
datepicher1.7.2版本沒有提供清除按鈕,這讓人有點遺憾。(好像以前的版本有提供)。沒有清除按鈕是很不方便的,特別是輸入框得到焦點就彈出日期選擇窗口的狀況更是如此,由於這時想要清除輸入框中的日期比較麻煩。在此推薦一位網友提供的加強版datepicher1.7.2。該加強版datepicher1.7.2不只實現了清除按鈕功能,並且增長了日期大小比較驗證,好比:一個日期只能在另外一個以後。能夠訪問該網址查看:http://www.cnblogs.com/yasin/archive/2009/07/10/1520736.html。這時datepicher的使用已經至關完美:java
$(function() { $("#effDate").datepicker( { showMonthAfterYear: true, // 月在年以後顯示 changeMonth: true, // 容許選擇月份 changeYear: true, // 容許選擇年份 dateFormat:'yy-mm-dd', // 設置日期格式 showClearButton: true, //clearText: '清除', closeText:'關閉', // 只有showButtonPanel: true纔會顯示出來 duration: 'fast', showAnim:'fadeIn', showOn:'button', buttonImage: 'images/commons/calendar.gif', buttonImageOnly: true, buttonText:'選擇日期', showButtonPanel: true, showOtherMonths: true, //appendText: '(yyyy-mm-dd)', onSelect: function(dateText, inst) // 使結束時間大於開始時間 { /** * 如下寫法在IE中出現問題。 * $('#expDate').datepicker('option', 'minDate', new Date(dateText.replace(/-/g,','))); * 時,在結束(過時時間)選擇時,年會沒有,並且控制會失效。經過調試,發現new Date(dateText.replace(/-/g,',')) * 返回的結果是NaN。說明Date對象不能這麼構造(可是Firefox能夠) */ var arys = new Array(); var arys = dateText.split('-'); $('#expDate').datepicker('option', 'minDate', new Date(arys[0],arys[1]-1,arys[2])); } }); $("#expDate").datepicker( { showMonthAfterYear: true, // 月在年以後顯示 changeMonth: true, // 容許選擇月份 changeYear: true, // 容許選擇年份 dateFormat:'yy-mm-dd', // 設置日期格式 showClearButton: true, // 自定義的方法(1.7.2沒有清除按鈕) //clearText: '清除', // 自定義的文本,在文檔在有定義(js中) closeText:'關閉', // 只有showButtonPanel: true纔會顯示出來 duration: 'fast', showAnim:'fadeIn', showOn:'button', // 在輸入框旁邊顯示按鈕觸發,默認爲:focus。還能夠設置爲both buttonImage: 'images/commons/calendar.gif', // 按鈕圖標 buttonImageOnly: true, // 不把圖標顯示在按鈕上,即去掉按鈕 buttonText:'選擇日期', showButtonPanel: true, showOtherMonths: true, //appendText: '(yyyy-mm-dd)', onSelect: function(dateText, inst) { var arys = new Array(); var arys = dateText.split('-'); $('#effDate').datepicker('option','maxDate',new Date(arys[0],arys[1]-1,arys[2])); } }); });
四、國際化
datepicher提供了國際化的功能。只需將ui.datepicker-zh-CN.js導入頁面便可。(或者導入jquery-ui-i18n.js,該文件包含了不少中語言)注意,若是想使用上面提到的加強版datepicher1.7.2,則須要下載做者提供的國際化文件。另外,若是用Eclipse之類的工具編碼,注意用eclipse打開國際化文件看看,頗有可能顯示爲亂碼。只須要把文件的編碼格式改成utf-8,而後用其餘編輯工具,如editplus打開國際化文件,拷貝,粘貼覆蓋eclipse中的,保存就OK了。
五、國際化爲中文可能遇到的顯示問題
在使用國際化同時啓用changeYear和changeMonth後,兩個select顯示爲兩行,很很差看。找了很久,發如今官方提供的jquery-ui-1.7.2.custom.css中,應該做以下幾處修改: jquery
.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; }
應該改成: app
.ui-datepicker .ui-datepicker-title select {font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 47%;} .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: left; }
就OK了
六、換膚
jQuery UI預約義了不少皮膚,下載後,只需在頁面引入相應皮膚的jquery-ui-1.7.2.custom.css能夠實現換膚。若是給用戶提供換膚功能,能夠經過js控制,實現換膚。
總結:
能夠看出,datepicher是一個很好用的插件,比本身寫的確定要好用不少,推薦你們使用。
另外,在使用中,能夠定義一個文件,包含該插件的使用,配置好。之後有須要使用的地方,引入該文件,同時傳給當前須要使用日期選擇控件的id屬性,這樣即可以只配置一次了。eclipse
其餘實用方法:函數
使用方法:工具
1.限制日期ui
$("#resultDiv").datepicker({ onSelect: function (dateText, inst) { //代碼:選擇日期後觸發的事件 }, minDate: new Date(),//最小日期 maxDate: new Date($("#DateLimit").val())//最大日期 });
2.中文
jQuery(function ($) { $.datepicker.regional['zh-CN'] = { closeText: '關閉', prevText: '<上月', nextText: '下月>', currentText: '今天', monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], monthNamesShort: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'], dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], dayNamesShort: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], dayNamesMin: ['日', '一', '二', '三', '四', '五', '六'], weekHeader: '周', dateFormat: 'yy-mm-dd', firstDay: 1, isRTL: false, showMonthAfterYear: true, yearSuffix: '年' }; $.datepicker.setDefaults($.datepicker.regional['zh-CN']); });
下面爲兩種實現步驟:
思路一:
第一步 實現兩個datepicker組件。
須要定義兩個input標籤,類型爲text,並指定id屬性
HTML代碼以下
開始日期:<input type="text" id="start">
結束日期:<input type="text" id="end">
在js代碼中獲得兩個input元素的jQuery對象,並將其轉化爲datepicker組件
Js代碼以下
$(document).ready(function(){ $("#start").datepicker(); $("#end").datepicker(); });
實現以上操做後,在頁面中點擊文本框,若是出現datepicker則表明成功。
第二步 設置開始和結束日期
當選擇開始日期的值後,則結束日期的最小值應該就是開始日期;同理,當選擇結束日期後,開始日期的最大值則應該是結束日期。咱們能夠利用datepicker中的onSelect屬性來設置當選擇指定日期後觸發的事件,經過該事件來指定對應的datepicker最小日期或最大日期。
Js代碼以下
$("#start").datepicker({ onSelect:function(dateText,inst){ $("#end").datepicker("option","minDate",dateText); } }); $("#end").datepicker({ onSelect:function(dateText,inst){ $("#start").datepicker("option","maxDate",dateText); } });
注:匿名函數中的dateText屬性爲當前選擇日期的字符串
思路二:
第一步 同時得到兩個文本框對象,並將其轉換爲datepicker(利用jQuery的選擇器)
HTML代碼以下
開始日期:<input type="text" id="start">
結束日期:<input type="text" id="end">
Js代碼以下
var dates = $("#start,#end"); dates.datepicker();
第二步 一樣在選擇日期後,觸發onSelect事件,調用函數傳遞selectedDate參數,
函數體中首先判斷觸發事件的是開始日期仍是結束日期,經過該判斷來指定設置minDate或者是maxDate,而後利用not()函數,來反向選擇另外一個datepicker對象,並設置其對應的屬性。
Js代碼以下
dates.datepicker({ onSelect: function(selectedDate){ var option = this.id == "start" ? "minDate" : "maxDate"; dates.not(this).datepicker("option", option, selectedDate); } });
這樣在設置一方後,另外一方就會被限制了。