JavaScript 日期下拉选择器

日期下拉选择器,可自定义日期范围。
使用了一个技巧获取指定月份的天数。

运行效果:

代码下载:
test.htm (3794)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>日期下拉菜单</title>
<script type="text/javascript">
	var $ = function(id) {
		return "string" == typeof id ? document.getElementById(id) : id;
	};

	function addEventHandler(oTarget, sEventType, fnHandler) {
		if (oTarget.addEventListener) {
			oTarget.addEventListener(sEventType, fnHandler, false);
		} else if (oTarget.attachEvent) {
			oTarget.attachEvent("on" + sEventType, fnHandler);
		} else {
			oTarget["on" + sEventType] = fnHandler;
		}
	};

	var Class = {
		create : function() {
			return function() {
				this.initialize.apply(this, arguments);
			}
		}
	}

	Object.extend = function(destination, source) {
		for ( var property in source) {
			destination[property] = source[property];
		}
		return destination;
	}

	var DateSelector = Class.create();
	DateSelector.prototype = {
		initialize : function(idYear, idMonth, idDay, options) {
			var oYear = $(idYear), oMonth = $(idMonth), oDay = $(idDay), dt = new Date(), i = 0;

			this.oYear = oYear;
			this.oMonth = oMonth;
			this.oDay = oDay;
			this.SetOptions(options);

			var iYear = parseInt(this.options.Year), iMonth = parseInt(this.options.Month), iDay = parseInt(this.options.Day);
			this.Year = iYear > 1900 ? iYear : dt.getFullYear();
			this.Month = 1 <= iMonth && iMonth <= 12 ? iMonth
					: dt.getMonth() + 1;
			this.Day = iDay > 0 ? iDay : dt.getDate();

			this.MinYear = this.Year - (parseInt(this.options.MinYear) || 0);
			this.MaxYear = this.Year + (parseInt(this.options.MaxYear) || 0);

			this.SetYear();
			this.SetMonth();
			this.SetDay();

			var oThis = this;
			addEventHandler(oYear, "change", function() {
				oThis.onYearChange()
			});
			addEventHandler(oMonth, "change", function() {
				oThis.onMonthChange()
			});
			addEventHandler(oDay, "change", function() {
				oThis.onDayChange()
			});
		},
		//设置默认属性
		SetOptions : function(options) {
			this.options = {//默认值
				Year :0,//年
				Month :0,//月
				Day :0,//日
				MinYear :0,//最小年份与year相差的年数
				MaxYear :5
			//最大年份与year相差的年数
			};
			Object.extend(this.options, options || {});
		},
		//年改变事件
		onYearChange : function() {
			this.Year = this.oYear.value;
			this.SetDay();
		},
		//月改变事件
		onMonthChange : function() {
			this.Month = this.oMonth.value;
			this.SetDay();
		},
		//日改变事件
		onDayChange : function() {
			this.Day = this.oDay.value;
		},
		//年设置
		SetYear : function() {
			this.SetSelect(this.oYear, this.MinYear, this.MaxYear, this.Year
					- this.MinYear);
		},
		//月设置
		SetMonth : function() {
			this.SetSelect(this.oMonth, 1, 12, this.Month - 1);
		},
		//日设置
		SetDay : function() {
			//这里技巧地取得月份天数
			var daysInMonth = new Date(this.Year, this.Month, 0).getDate();
			if (this.Day > daysInMonth) {
				this.Day = daysInMonth;
			}
			;
			this.SetSelect(this.oDay, 1, daysInMonth, this.Day - 1);
		},
		//select设置
		SetSelect : function(oSelect, iMin, iMax, iIndex) {
			oSelect.options.length = 0;
			for ( var i = iMin; i <= iMax; i++) {
				var op = document.createElement("OPTION");
				op.value = i;
				op.innerHTML = i;
				oSelect.appendChild(op);
			}
			oSelect.selectedIndex = iIndex;
		}
	};
</script>
</head>

<body>
<select id="idYear"></select>
<select id="idMonth"></select>
<select id="idDay"></select>
<script>
	new DateSelector("idYear", "idMonth", "idDay", {
		minyear :10,
		maxyear :10
	});
</script>
</body>
</html>

test.htm
2008-07-26_065853.gif
快乐渡过每一天,减肥坚持每一天