在jquery ui中,提供了一个非常实用的日期选择器:datepicker,使用它能非常方便的展现日历中的日期,灵活配置相关选项,包括日期格式、范围等。我们经常在WEB应用中用到datepicker,比如要求用户输入日期进行相关查询的。我们很早之前就应用datepicker到很多项目中,今天整理成文与大家分享。

demo http://www.helloweba.com/demo/datepicker/

download http://www.helloweba.com/demo/downzip/datepicker.rar

查看演示DEMO下载源码

查看演示DEMO下载源码

准备工作

首先请到jqueryui.com官网下载datepicker插件代码,注意官网提供了整个jquery ui的所有插件下载,但是您可以选择其中几个用到的插件下载,本文中只用到datepicker,所以只选择下载jquery ui核心代码和datepicker代码。你可以直接点击本文上面的Download下载按钮下载demo源码包,其中就包括了datepicker插件源码。

HTML

首先在head之间引入jquery库文件和datepicker插件以及相关css。

 
<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery-ui-datepicker.js"></script> 
<link rel="stylesheet" type="text/css" href="css/jquery-ui.css" /> 

然后在body间加入一个输入框。

 
<input type="text" id="date_1" /> 

Javscript

调用datepicker非常简单,直接使用以下代码就可以实现:

 
$(function(){ 
    $("#date_1").datepicker(); 
}); 

这样,单击输入框的时候会自动弹出一个日期选择器,选中日期后,自动关闭选择器,并在输入框中显示选中的日期。

选项及事件使用说明

datepicker提供了丰富的选项设置事件方法调用,笔者先将经常用到的相关属性和方法整理成表格,方便查询和使用。

选项 描述 默认值
altField 将选择的日期同步到另一个域中,配合altFormat可以显示不同格式的日期字符串。demo ''
altFormat 当设置了altField的情况下,显示在另一个域中的日期格式。 ''
appendText 在日期插件的所属域后面添加指定的字符串。 ''
buttonImage 设置可以用来点击弹出日历的按钮图片,如果非空,则按钮的文本将成为alt属性,不直接显示。demo ''
buttonImageOnly 设置为true时,图片将作为按钮可以点击触发弹出日历 false
buttonText 设置触发按钮的文本内容。 ...
changeMonth 设置是否允许通过下拉框列表选取月份。 false
changeYear 设置是否允许通过下拉框列表选取年份。 false
closeText 设置关闭按钮的文本内容,此按钮需要通过showButtonPanel参数的设置才显示。 'Done'
constrainInput 如果设置为true,则约束当前输入的日期格式。 true
currentText 设置当天按钮的文本内容,此按钮需要通过showButtonPanel参数的设置才显示。 'Today'
dateFormat 设置日期字符串的显示格式。demo 'mm/dd/yy'
dayNames 设置一星期中每天的名称,从星期天开始。此内容用于dateFormat时显示,以及日历中当鼠标移至行头时显示。 ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
dayNamesMin 设置一星期中每天的缩语,从星期天开始,此内容用于dateFormat时显示,以前日历中的行头显示。 ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
dayNamesShort 设置一星期中每天的缩语,从星期天开始,此内容用于dateFormat时显示,以前日历中的行头显示。 ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
defaultDate 设置默认加载完后第一次显示时选中的日期。可以是Date对象,或者是数字(从今天算起,例如+7),或者有效的字符串('y'代表年, 'm'代表月, 'w'代表周, 'd'代表日, 例如:'+1m +7d')。 null
duration 设置日期控件展开动画的显示时间,可选是"slow", "normal", "fast",''代表立刻,数字代表毫秒数。 'normal'
firstDay 设置一周中的第一天。星期天为0,星期一为1,以此类推。 0
gotoCurrent 如果设置为true,则点击当天按钮时,将移至当前已选中的日期,而不是今天。 false
hideIfNoPrevNext 设置当没有上一个/下一个可选择的情况下,隐藏掉相应的按钮。 false
isRTL 如果设置为true,则所有文字是从右自左。 false
maxDate 设置一个最大的可选日期。可以是Date对象,或者是数字(从今天算起,例如+7),或者有效的字符串('y'代表年, 'm'代表月, 'w'代表周, 'd'代表日, 例如:'+1m +7d')。demo null
minDate 设置一个最小的可选日期。可以是Date对象,或者是数字(从今天算起,例如+7),或者有效的字符串('y'代表年, 'm'代表月, 'w'代表周, 'd'代表日, 例如:'+1m +7d')。 null
monthNames 设置所有月份的名称。 ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
monthNamesShort 设置所有月份的缩写。 ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
navigationAsDateFormat 如果设置为true,则formatDate函数将应用到 prevText,nextText和currentText的值中显示,例如显示为月份名称。 false
nextText 设置“下个月”链接的显示文字。 'Next'
numberOfMonths 设置一次要显示多少个月份。如果为整数则是显示月份的数量,如果是数组,则是显示的行与列的数量。demo 1
prevText 设置“上个月”链接的显示文字。 'Prev'
shortYearCutoff 设置截止年份的值。如果是(0-99)的数字则以当前年份开始算起,如果为字符串,则相应的转为数字后再与当前年份相加。当超过截止年份时,则被认为是上个世纪。 '+10'
showAnim 设置显示、隐藏日期插件的动画的名称。 'show'
showButtonPanel 设置是否在面板上显示相关的按钮。 false
showCurrentAtPos 设置当多月份显示的情况下,当前月份显示的位置。自顶部/左边开始第x位。 0
showMonthAfterYear 是否在面板的头部年份后面显示月份。 false
showOn 设置什么事件触发显示日期插件的面板,可选值:focus, button, both 'focus'
showOptions 如果使用showAnim来显示动画效果的话,可以通过此参数来增加一些附加的参数设置。 {}
showOtherMonths 是否在当前面板显示上、下两个月的一些日期数(不可选)。 false
stepMonths 当点击上/下一月时,一次翻几个月。 1
yearRange 控制年份的下拉列表中显示的年份数量,可以是相对当前年(-nn:+nn),也可以是绝对值 (-nnnn:+nnnn) '-10:+10'
beforeShow 在日期控件显示面板之前,触发此事件,并返回当前触发事件的控件的实例对象。 function(input)
beforeShowDay 在日期控件显示面板之前,每个面板上的日期绑定时都触发此事件,参数为触发事件的日期。调用函数后,必须返回一个数组:[0]此日期是否可选(true/false),[1]此日期的CSS样式名称(""表示默认),[2]当鼠标移至上面出现一段提示的内容。 function(date)
onChangeMonthYear 当年份或月份改变时触发此事件,参数为改变后的年份月份和当前日期插件的实例。 function(year, month, inst)
onClose 当日期面板关闭后触发此事件(无论是否有选择日期),参数为选择的日期和当前日期插件的实例。demo function(dateText, inst)
onSelect 当在日期面板选中一个日期后触发此事件,参数为选择的日期和当前日期插件的实例。 function(dateText, inst)

http://www.jb51.net/article/27184.htm

   jQuery是一款不可多得的非常优秀的javascript脚本开发库,而基于其上的很多插件也是非常规范和卓越的,如果错过这番美景真是太可惜了,比如datepicker这个插件。
    一般MIS系统的前端,尤其是用户注册页面,都会有诸如“出身年月”的日期输入框,最简单的做法就是使用一个<input type="text"/>标签,这样做的弊端有很多:首先是与数据库字段类型的匹配、其次是输入日期的合法性如“13月”或者闰年等等问题,如果深入下去还有非常多的地方值得推敲。当前比较流行的做法是使用下拉菜单<select><option></option></select>来构造,但是这样做无论交互性、复杂度和可移植性都不尽如人意,因为至少需要构建3个联动的下拉菜单,需要自己编写大量的脚本处理日期合法性。
    datepicker带来了美好的春天,先看看使用默认样式时它的样子:

   
    完全GUI般的用户体验,炫目的动态展现效果,精确的日期控制和高度的灵活的参数配置,这一切使得datepicker受到众多开发者的青睐,其中包括大名鼎鼎的google,在其google calendar项目中就使用了这个脚本,有兴趣可以去看看。顺便啰嗦一句,上图的默认效果,在javascript中,用户只需写一句话就可以实现了,怎么样,心动了吧,follow me:
    1.下载jQuery核心文件就不用说了吧,datepicker是轻量级插件,只需jQuery的min版本就行了,然后下载datepicker(内含jQuery1.2.6_min),您也可以到官方网站下载:http://marcgrabanski.com/pages/code/jquery-ui-datepicker。
    2.在HTML中引用下载下来的两个js:

  1. <script language="javascript" src="js/jquery-1.2.6.min.js"></script>
  2. <script language="javascript" src="js/ui.datepicker.js"></script>

    3.在HTML中引入默认样式表文件,这个文件也在刚刚的压缩包中,如果在官网下载,首页就有这个CSS文件下载,也可选择其他皮肤的CSS:

  1. <link rel="stylesheet" href="js/ui.datepicker.css" type="text/css" media="screen" title="core css file" charset="utf-8" />

    4.在HTML中插入文本域,最好设置成只读,不接受用户的手动输入,防止格式混乱,以id标记好。

  1. <input id="dateinput" type="text" readonly="readonly"/>

    5.编写js代码,实现最终效果。

  1. <script language="javascript">
  2. $(document).ready(function() {  
  3.        $('#dateinput').datepicker();  
  4.    });  
  5. </script>

这样就基本完成一个日期输入文本域了,但是是英文的,根据不同的MIS系统,有的目标人群是上了年级的用户,建议将界面改成中文,可以如此操作,稍微改动一下刚刚的函数,like this:

  1. <script language="javascript">
  2. $(document).ready(function() {  
  3.        $('#dateinput').datepicker({  
  4.            dateFormat: 'yy-mm-dd',  //日期格式,自己设置
  5.            buttonImage: 'calendar.gif',  //按钮的图片路径,自己设置
  6.            buttonImageOnly: true,  //Show an image trigger without any button.
  7.            showOn: 'both',//触发条件,both表示点击文本域和图片按钮都生效
  8.        yearRange: '1990:2008',//年份范围
  9.        clearText:'清除',//下面的就不用详细写注释了吧,呵呵,都是些文本设置
  10.        closeText:'关闭',
  11.        prevText:'前一月',
  12.        nextText:'后一月',
  13.        currentText:' ',
  14.        monthNames:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
  15.        });  
  16.    });  
  17. </script>

OK,大功告成,我根据自己的要求,写的页面的代码如下,仅供参考,自己尝试一下吧:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>无标题文档</title>
  6. <link rel="stylesheet" href="js/ui.datepicker.css" type="text/css" media="screen" title="core css file" charset="utf-8" />
  7. <script language="javascript" src="js/jquery-1.2.6.min.js"></script>
  8. <script language="javascript" src="js/ui.datepicker.js"></script>
  9. <script language="javascript">
  10. $(document).ready(function() {  
  11.         var yearFrom=new Date().getYear()-60+1900;
  12.         var yearTo=new Date().getYear()-18+1900;      
  13.        $('#dateinput').datepicker({  
  14.        dateFormat: 'yy-mm-dd',  
  15.        buttonImage: 'calendar.gif',  
  16.        buttonImageOnly: true,  
  17.        showOn: 'both',
  18.        yearRange: yearFrom+':'+yearTo,
  19.        clearText:'清除',
  20.        closeText:'关闭',
  21.        prevText:'前一月',
  22.        nextText:'后一月',
  23.        currentText:' ',
  24.        monthNames:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
  25.        });  
  26.    });  
  27. </script>
  28. </head>
  29. <body>
  30. <input id="dateinput" type="text" readonly="readonly"/>
  31. </body>
  32. </html>

发表回复