/**
* jQuery.jSelectDate Version 0.2
* jQuery 下拉列表选择日期插件
*
* Wathon Team
* http://www.wathon.com
* http://huacn.cnblogs.com
* http://www.cnblogs.com/huacn/archive/2008/01/16/jquery_plugin_jSelectDate.html
*
* created by:
* 李华顺 fyj
* 更改说明:原来的是指定起始和结束年份;改为指定以当前年为起点,向前和向后个加减多少年即参数yearBefore,yearAfter //2008-12-23*//** ***************** Example ***********************
$("body").ready(function(){
$("input.date").jSelectDate({
css:"date",
yearBefore : 0,//当前年份的前几年
yearAfter : 10,//当前年份的后几年
disabled : true
});
})
* **************** End Example ***********************/varjSelectDate={/**
* 选项设置*/settings : {
css:"date",
borderCss:"date",
disabled:false,
yearBefore :10,
yearAfter :10,
isShowLabel:true},/**
* 初始化对向
* @param {Object} el 用于存放日期结果的文本框 jQuery DOM*/init:function(els){
els.each(function(){varel=$(this);/*取得旧的日期*/varelValue=el.val();
elDate=newDate(elValue.split("-").join("/"));varnYear=elDate.getFullYear();varnMonth=jSelectDate.returnMonth(elDate.getMonth());varnDay=elDate.getDate();/*隐藏给出的对向*/el.hide();/*先算出当前共有多少个jSelectDate*/varcurrentIdx=$("jSelectDateBorder").length+1;/*加入控件到文本框的位置*/varspanDate=document.createElement("span");
spanDate.id="spanDate"+currentIdx;
spanDate.className="jSelectDateBorder"+jSelectDate.settings.borderCss;
spanDate.disabled=jSelectDate.settings.disabled;
el.after(spanDate);/*创建年*/varselYear=document.createElement("select");
selYear.id="selYear"+currentIdx
selYear.className=jSelectDate.settings.css;
selYear.disabled=jSelectDate.settings.disabled;/*加入选项*/varbegin=jSelectDate.settings.yearNow-jSelectDate.settings.yearBefore;varend=jSelectDate.settings.yearNow+jSelectDate.settings.yearAfter;for(vari=begin; i<=end; i++) {varoption=document.createElement("option");
option.value=i;
option.innerHTML=i;/*判断是否有旧的值,如果有就选中*/if(!isNaN(nYear)) {if(i==nYear) {
option.selected=true;
}
}
selYear.appendChild(option);
option=null;
}
$(spanDate).append(selYear);/*创建月*/varselMonth=document.createElement("select");
selMonth.id="selMonth"+currentIdx
selMonth.className=jSelectDate.settings.css;
selMonth.disabled=jSelectDate.settings.disabled;/*加入选项*/for(vari=1; i<=12; i++) {varoption=document.createElement("option");
option.value=i;
option.innerHTML=i;/*判断是否有旧的值,如果有就选中*/if(!isNaN(nMonth)) {if(i==nMonth) {
option.selected=true;
}
}
selMonth.appendChild(option);
option=null;
}/*加入控件到文本框的位置*/$(selYear).after(selMonth);/*创建日*/varselDay=document.createElement("select");
selDay.id="selDay"+currentIdx
selDay.className=jSelectDate.settings.css;
selDay.disabled=jSelectDate.settings.disabled;/*算出最大的天数*/varmaxDayNum=30;if(nMonth==2) {if(jSelectDate.isLeapYear(nYear)) {
maxDayNum=29;
}else{
maxDayNum=28;
}
}elseif(jSelectDate.isLargeMonth(nMonth)) {
maxDayNum=31;
}/*加入选项*/for(vari=1; i<=maxDayNum; i++) {varoption=document.createElement("option");
option.value=i;
option.innerHTML=i;/*判断是否有旧的值,如果有就选中*/if(!isNaN(nDay)) {if(i==nDay) {
option.selected=true;
}
}
selDay.appendChild(option);
option=null;
}/*加入控件到文本框的位置*/$(selMonth).after(selDay);if(jSelectDate.settings.isShowLabel) {
$(selMonth).before("年");
$(selDay).before("月");
$(selDay).after("日");
}else{
$(selMonth).before("");
$(selDay).before("");
}/*返回当前选择的日期*/vargetDate=function(){varyear=$(selYear).val();varmonth=$(selMonth).val();varday=$(selDay).val();
el.val(year+"-"+month+"-"+day);
}/**
* 给几个下拉列表加入更改后的事件*/$(selDay).change(function(){returngetDate();
});
$(selMonth).change(function(){
jSelectDate.progressDaySize(this,true);/*更新文本框中的日期*/returngetDate();
});
$(selYear).change(function(){
jSelectDate.progressDaySize(this,false);returngetDate();
});
})
},/**
* 判断是否闰年
* @param {Object} year
* @author 没剑 http://regedit.cnblogs.com*/isLeapYear :function(year){return(0==year%4&&((year%100!=0)||(year%400==0)));
},/**
* 判断是否是大月
* @param {Object} monthNum*/isLargeMonth :function(monthNum){varlargeArray=[true,false,true,false,true,false,true,true,false,true,false,true];returnlargeArray[monthNum-1];
},
returnMonth:function(num){vararr=newArray("1","2","3","4","5","6","7","8","9","10","11","12");returnarr[num];
},/**
* 创建一个Option对象
* @param {Object} value 值
* @param {Object} text 文本*/createOption :function(value,text){varoption=document.createElement("option");
option.value=value;
option.innerHTML=text;returnoption;
},/**
* 处理天数
* @param {Object} el 下拉列表对像
* @param {Object} isMonth 是否是月的下拉列表 或者就处理 年的下拉列表*/progressDaySize:function(el,isMonth){if(isMonth==true) {/*选择月时处理大月、小月和二月的情况*/varmonth=$(el).val();varyear=$($("select", $(el).parent())[0]).val()varselDay=$($("select", $(el).parent())[2]);if(month==2) {/*2月处理*/$("option:contains('31')", selDay).remove();
$("option:contains('30')", selDay).remove();/*闰年处理*/if(!jSelectDate.isLeapYear(year)) {
$("option:contains('29')", selDay).remove();
}else{if($("option:contains('29')", selDay).length==0) {
selDay.append(jSelectDate.createOption(29,29));
}
}
}elseif(!jSelectDate.isLargeMonth(month)) {/*小月处理*/if($("option:contains('30')", selDay).length==0) {
selDay.append(jSelectDate.createOption(30,30));
}
$("option:contains('31')", selDay).remove();
}else{/*大月处理*/if($("option:contains('30')", selDay).length==0) {
selDay.append(jSelectDate.createOption(30,30));
}if($("option:contains('31')", selDay).length==0) {
selDay.append(jSelectDate.createOption(31,31));
}
}
}else{/*处理闰年的二月问题*/varpanelDate=$(el).parent();varyear=$(el).val();varmonth=$($("select",panelDate)[1]).val()varselDay=$($("select",panelDate)[2]);if(month==2){
$("option:contains('31')",selDay).remove();
$("option:contains('30')",selDay).remove();if(!jSelectDate.isLeapYear(year)){
$("option:contains('29')",selDay).remove();
}else{if($("option:contains('29')",selDay).length==0){
selDay.append(jSelectDate.createOption(29,29));
}
}
}
}
}
}
jQuery.fn.jSelectDate=function(settings){vargetNowYear=function(){/*得到现在的年*/vardate=newDate();returndate.getFullYear();
}//alert(settings.yearBefore);jSelectDate.settings.yearNow=getNowYear();
$.extend(jSelectDate.settings, settings);
jSelectDate.init($(this));return$(this);
}