/* * 日期选择(jDate)插件 * 作者:江鸿宾(QQ33080907) * 最近修改:2015-4-2 * 本插件只用于作者参与的项目,未经许可请勿转载 */ ;(function($){ //公用参数 var today=new Date(); var todayyear=today.getFullYear(); var months="一,二,三,四,五,六,七,八,九,十,十一,十二".split(","); var monthlengths="31,28,31,30,31,30,31,31,30,31,30,31".split(","); var weekdays="日,一,二,三,四,五,六".split(","); var dateRegEx=/^(\d{4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/; var yearRegEx=/^\d{4,4}$/; //在页面中插入style,这样不用单独引用css文件 var style=""; $("head").append(style); //处理今日(保留年月日,去掉时分秒) today=new Date(todayyear,today.getMonth(),today.getDate()); //绑定插件 $.fn.jDate=function(options){ var defaults={ chosendate:today, //初始状态选中日期,默认为今天 startdate:todayyear-100, //日期范围起,可以是完整日期格式或者4位年份数字,如果为年份表示该年第一天,默认为百年前的年份数字,日期范围只判定到天,不判定时间 enddate:todayyear+1, //日期范围止,要求同上 showtoday:true //是否在提示框底部显示今天日期 }; var opts=$.extend({},defaults,options); //获取日期范围 getRange(); return this.each(function(){ var jdate; jQuery.data(jQuery(this).get(0),"jdate",{hasjdate:false}); jQuery(this).click(function(e){ var $this=jQuery(this); //DOM对象,非jQuery对象 var element=$this.get(0); //当前对象还没有日期框才弹出 if(jQuery.data(element,"jdate").hasjdate==false){ jQuery.data(element,"jdate",{hasjdate:true}); //输入框初始状态指定的日期 var initialDate=$this.val(); //采用输入框初始值 if(initialDate&&dateRegEx.test(initialDate)){var chosendate=getTheDate(initialDate);} //传入参数 else if(opts.chosendate.constructor==Date){var chosendate=opts.chosendate;} else{ var chosendate=getTheDate(opts.chosendate); //选中日期不在日期范围内,则采用今日 if(chosendateopts.enddate){var chosendate=today;} } //如果选中日期不在日期范围,则采用范围起始 if(chosendateopts.enddate){var chosendate=opts.startdate;} //jdate的HTML代码 jdate=newDateHTML(); //定位日期选择层 var xy=$this.offset(); var x=xy.left; var y=xy.top+$this.outerHeight()+1; jdate.css({"left":x,"top":y}); //插入到body中 jdate.hide().appendTo("body").fadeIn("normal"); //jQuery("body").append(jdate); //为年份和月份选择列表绑定事件 jQuery("select",jdate).on("change",function(){loadDate(element,jdate,chosendate);}); //绑定关于按钮 jQuery("input:button.about",jdate).on("click",function(){alert("jQuery日期选取插件 作者:江鸿宾(QQ33080907)");}); //jQuery(":button.about",jdate).remove(); //绑定关闭按钮 jQuery("input:button.close",jdate).on("click",function(){closeIt(element,jdate,initialDate);}); //设置年月选择列表初始值 jQuery("select[name='year']",jdate).val(chosendate.getFullYear()); jQuery("select[name='month']",jdate).val(chosendate.getMonth()); loadDate(element,jdate,chosendate); } }); }); //构造一个新的日期选择框 function newDateHTML(){ var table=jQuery("
"); table.append(''); table.append(''); table.append(''); //年份选择列表 var yearselect=""; //月份选择列表 var monthselect=""; //把年份列表和月份列表插入到thead中 jQuery("thead",table).append("
"+yearselect+" "+monthselect+"
"); //把星期几的汉字插入到thead中 jQuery("thead",table).append(""); for(var i=0;i<7;i++){jQuery("thead>tr.days",table).append(""+weekdays[i]+"");} //在tbody中插入6行空的td for(var i=0;i<6;i++){jQuery("tbody",table).append("");} //在最后一行显示今日 if(opts.showtoday){jQuery("tfoot",table).append("今天是:"+today.getFullYear()+"年"+(today.getMonth()+1)+"月"+today.getDate()+"日");} //返回table对象 return table; } //显示日期选择框(点击元素、日期框对象、选中日期) function loadDate(element,jdate,chosendate){ //清空日期框原有的日期,取消绑定,移除样式,移除title属性 var td=jQuery("tbody td",jdate).off().empty().removeClass().removeAttr("title"); //取出当前需要装载的年份和月份,月份0表示一月,1表示二月,以此类推 var y=jQuery("select[name='year']",jdate).val(); var m=jQuery("select[name='month']",jdate).val(); //当月第一天 var d=new Date(y,m,1); //当月第一天是星期几?0表示星期日,1表示星期一,以此类推 var startindex=d.getDay(); //当月总共有多少天? var numdays=monthlengths[m]; //考虑闰年情况 if(m==1&&((y%4==0&&y%100!=0)||y%400==0)){numdays=29;} //显示所有行,有的月份没有最后一行被隐藏了 jQuery("tr",jdate).show(); //把日期数字填充到td中,i表示从1开始的日期 for(var i=1;i<=numdays;i++){ var cell=td.eq(i+startindex-1).text(i).addClass("date"); //当前td的日期 var date=new Date(y,m,cell.text()); //当前td的字符串格式 var datestring=getTheString(date); //检测日期范围 if(date>=opts.startdate&&date<=opts.enddate){ cell .attr("title",datestring) .hover(function(){jQuery(this).addClass("over");},function(){jQuery(this).removeClass("over");}) .on("click",function(){closeIt(element,jdate,jQuery(this).attr("title"));}); //高亮初始状态即选中的日期 if(datestring==getTheString(chosendate)){cell.addClass("chosen");} } else{cell.addClass("disabled");} } //今日 if(opts.showtoday){ var cell=jQuery("tfoot>tr>td",jdate); if(today>=opts.startdate&&today<=opts.enddate){ cell .hover(function(){jQuery(this).addClass("over");},function(){jQuery(this).removeClass("over");}) .on("click",function(){closeIt(element,jdate,getTheString(today));}); } else{cell.addClass("disabled");} } //如果最后有空行则隐藏 if(jQuery("tbody>tr:last>td",jdate).text()==""){jQuery("tbody>tr:last",jdate).hide();} } //关闭日期框 function closeIt(element,jdate,datestring){ jQuery(element).val(datestring); jdate.remove(); jdate=null; jQuery.data(element,"jdate",{hasjdate:false}); } //根据日期字符串得到日期格式数据 function getTheDate(str){ //把日期中的斜杠替换为短横 var str=str.replace(/\//g,"-").split("-"); //月份前面有0则去掉 return (new Date(str[0],str[1]*1-1,str[2])); } //根据日期格式得到字符串 function getTheString(date){ return (date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()); } //计算时间范围 function getRange(){ //开始 if(opts.startdate.constructor==Date){opts.startdate=new Date(opts.startdate.getFullYear(),opts.startdate.getMonth(),opts.startdate.getDate());} else if(yearRegEx.test(opts.startdate)){opts.startdate=new Date(opts.startdate,0,1);} else if(dateRegEx.test(opts.startdate)){opts.startdate=getTheDate(opts.startdate);} else{opts.startdate=today;} //结束 if(opts.enddate.constructor==Date){opts.enddate=new Date(opts.enddate.getFullYear(),opts.enddate.getMonth(),opts.enddate.getDate());} else if(yearRegEx.test(opts.enddate)){opts.enddate=new Date(opts.enddate,11,31);} else if(dateRegEx.test(opts.enddate)){opts.enddate=getTheDate(opts.enddate);} else{opts.enddate=today;} //检测范围是否合法 if(opts.startdate>opts.enddate){alert("对不起,绑定jDate插件时日期范围设置错误!");return false;} } //调试 function debug(str){ if(jQuery("#debug").size()==0){$("body").prepend("
");} jQuery("#debug").append(str+"
"); } }; })(jQuery);