好了,天数的算法也解决了,那么我们可以轻松写出一个InitDaySelect方法来初始化天数了,在这个方法里要根据当前年份下拉菜单和月份下拉菜单的值算出该月的天数,由于天数是变动的,因此我们在该方法里也可事先清空天数下拉菜单的内容。
<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.InitYearSelect(); this.InitMonthSelect(); this.InitDaySelect(); }
// 增加一个最大年份的属性 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); } } </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); </script> </body> </html>
现在已经写好几个方法用来初始化三个下拉菜单的选项了,我们需要做的是让它们结合并动起来。如果年份或月份有变动,那么应该重新计算天数并且重新初始化天数,这可以通过selYear和selMonth的onchange来实现。由于这三个下拉菜单是要紧密联动的,因此特地给它们增加一个属性Selector,值为当前的DateSelector实例。同时实现selYear和selMonth的onchange,如果发生onchange则调用InitDaySelect重新初始化selDay下拉菜单。
<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.InitYearSelect(); this.InitMonthSelect(); this.InitDaySelect(); 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); } }
// 增加一个最大年份的属性 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(); } </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); </script> </body> </html>
出处:蓝色理想
责任编辑:moby
上一页 实现一个日期下拉菜单 [1] 下一页 实现一个日期下拉菜单 [3]
◎进入论坛网页制作、网站综合版块参加讨论
|