到此为止我们已经基本实现DateSelector类要提供的功能了,为了更灵活地控制它,我们应该给它增加设定初始值的功能。一般来说有两种需求,第一种是传入一个Date对象,第二种是传入三个值分别表示年、月、日,也就是说我们必须重载构造函数,形式如下:
function DateSelector(selYear, selMonth, selDay) function DateSelector(selYear, selMonth, selDay, date) function DateSelector(selYear, selMonth, selDay, year, month, day)
当然,JavaScript没有重载的概念,但我们可以给它模拟出来,方法就是根据传入参数的个数(即arguments对象的length)以及类型来判断,这需要对原有的构造函数进行一定的改动使之更模块化地实现这三种情况。由于年份和月份是固定不变的,参数只会改变selYear和selMonth的已选选项,而selDay则要根据selYear和selMonth的值再动态生成,因此我们将初始化菜单代码再提出来写一个InitSelector方法里,它有三个参数,分别是year, month, day,功能是根据这三个参数来生成相应的菜单选项,我们这次调试使用2004年2月29日为初始值。要设置初始值的时候一般我们会循环访问option的值,但这里情况特殊,我们是可以根据一定的计算来得到默认选择的option的下标的。
年份下标 = MaxYear - year 月份下标 = month - 1 天数下标 = day - 1
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>如何实现一个日期下拉菜单</title> <script type="text/javascript"> function DateSelector(selYear, selMonth, selDay) { this.selYear = selYear; this.selMonth = selMonth; this.selDay = selDay; this.selYear.Group = this; this.selMonth.Group = this; // 给年份、月份下拉菜单添加处理onchange事件的函数 if(window.document.all != null) // IE { this.selYear.attachEvent("onchange", DateSelector.Onchange); this.selMonth.attachEvent("onchange", DateSelector.Onchange); } else // Firefox { this.selYear.addEventListener("change", DateSelector.Onchange, false); this.selMonth.addEventListener("change", DateSelector.Onchange, false); }
if(arguments.length == 4) // 如果传入参数个数为4,最后一个参数必须为Date对象 this.InitSelector(arguments[3].getFullYear(), arguments[3].getMonth() + 1, arguments[3].getDate()); else if(arguments.length == 6) // 如果传入参数个数为6,最后三个参数必须为初始的年月日数值 this.InitSelector(arguments[3], arguments[4], arguments[5]); else // 默认使用当前日期 { var dt = new Date(); this.InitSelector(dt.getFullYear(), dt.getMonth() + 1, dt.getDate()); } }
// 增加一个最大年份的属性 DateSelector.prototype.MinYear = 1900;
// 增加一个最大年份的属性 DateSelector.prototype.MaxYear = (new Date()).getFullYear();
// 初始化年份 DateSelector.prototype.InitYearSelect = function() { // 循环添加OPION元素到年份select对象中 for(var i = this.MaxYear; i >= this.MinYear; i--) { // 新建一个OPTION对象 var op = window.document.createElement("OPTION"); // 设置OPTION对象的值 op.value = i; // 设置OPTION对象的内容 op.innerHTML = i; // 添加到年份select对象 this.selYear.appendChild(op); } }
// 初始化月份 DateSelector.prototype.InitMonthSelect = function() { // 循环添加OPION元素到月份select对象中 for(var i = 1; i < 13; i++) { // 新建一个OPTION对象 var op = window.document.createElement("OPTION"); // 设置OPTION对象的值 op.value = i; // 设置OPTION对象的内容 op.innerHTML = i; // 添加到月份select对象 this.selMonth.appendChild(op); } }
// 根据年份与月份获取当月的天数 DateSelector.DaysInMonth = function(year, month) { var date = new Date(year, month, 0); return date.getDate(); }
// 初始化天数 DateSelector.prototype.InitDaySelect = function() { // 使用parseInt函数获取当前的年份和月份 var year = parseInt(this.selYear.value); var month = parseInt(this.selMonth.value); // 获取当月的天数 var daysInMonth = DateSelector.DaysInMonth(year, month); // 清空原有的选项 this.selDay.options.length = 0; // 循环添加OPION元素到天数select对象中 for(var i = 1; i <= daysInMonth ; i++) { // 新建一个OPTION对象 var op = window.document.createElement("OPTION"); // 设置OPTION对象的值 op.value = i; // 设置OPTION对象的内容 op.innerHTML = i; // 添加到天数select对象 this.selDay.appendChild(op); } }
// 处理年份和月份onchange事件的方法,它获取事件来源对象(即selYear或selMonth) // 并调用它的Group对象(即DateSelector实例,请见构造函数)提供的InitDaySelect方法重新初始化天数 // 参数e为event对象 DateSelector.Onchange = function(e) { var selector = window.document.all != null ? e.srcElement : e.target; selector.Group.InitDaySelect(); }
// 根据参数初始化下拉菜单选项 DateSelector.prototype.InitSelector = function(year, month, day) { // 由于外部是可以调用这个方法,因此我们在这里也要将selYear和selMonth的选项清空掉 // 另外因为InitDaySelect方法已经有清空天数下拉菜单,因此这里就不用重复工作了 this.selYear.options.length = 0; this.selMonth.options.length = 0; // 初始化年、月 this.InitYearSelect(); this.InitMonthSelect(); // 设置年、月初始值 this.selYear.selectedIndex = this.MaxYear - year; this.selMonth.selectedIndex = month - 1; // 初始化天数 this.InitDaySelect(); // 设置天数初始值 this.selDay.selectedIndex = day - 1; } </script> </head> <body> <select id="selYear"></select> <select id="selMonth"></select> <select id="selDay"></select> <script type="text/javascript"> var selYear = window.document.getElementById("selYear"); var selMonth = window.document.getElementById("selMonth"); var selDay = window.document.getElementById("selDay");
// 新建一个DateSelector类的实例,将三个select对象传进去 new DateSelector(selYear, selMonth ,selDay, 2004, 2, 29); // 也可以试试下边的代码 // var dt = new Date(2004, 1, 29); // new DateSelector(selYear, selMonth ,selDay, dt); </script> </body> </html>
好了,日期下拉菜单已经能够如我们想象的那样开始工作了,在调用的时候我们只需要执行new DateSelector(selYear, selMonth ,selDay, 2004, 2, 29);就可以,而且它内部关系紧密,你同一个页面可以同时运行好几组日期下拉菜单而互不影响,这也是我要采用类的形式而不是采用一组函数来实现的缘由了,我以后写的文章也会尽可能采用类的形式,这样写出来的代码使用起来会更加方便。像以往一样,我也得说88啦,希望大家能够继续支持无忧脚本的原创文章,并且踊跃参与到其中来。
出处:蓝色理想
责任编辑:moby
上一页 实现一个日期下拉菜单 [2] 下一页
◎进入论坛网页制作、网站综合版块参加讨论
|