html如何实现日期下拉菜单,实现一个日期下拉菜单

本文介绍了如何根据实际需求设计一个联动日期下拉菜单,包括设定有效年份范围、月份和天数计算,通过DateSelector类管理年月日选择。通过实例展示了如何初始化并动态计算天数,适合JavaScript开发者学习日期组件的交互设计。
摘要由CSDN通过智能技术生成

这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。本文调试环境为IE6/firefox1.5。

首先来分析一下日期下拉菜单的需求。建议大家在写任何程序的时候都应该在动手编程之前想清楚自己需要些什么,这样编程才有效率。

年份: 一般来说有一个有效年份,比如说1900年至当前年份才是为效的,这个要根据实际需求来确定,如果是该下拉菜单是用来选择出生年月日还得把最大的年份减到一定的数目,如果有人的生日选择了2005年(即当前的年份),那是不正常的。

月份:没有什么特殊需求,不管是哪一年都是有十二个月。

天数:每个月的天数都可能是不定的,当然这可以根据一定的算法求出来,而它的根据就是当前选择的年份和月份。月份都有一个固定的天数,即一、三、五、七、八、十、十二月是三十一天,而四、六、九、十一月是三十天,二月份要根据当年是否为闰年判断是二十八天还是二十九天。求当月的天数我提出一个比较简单的算法,可以只根据当前的年份和月份就可以求出当月的天数,这会在后边讲一讲思路并将其实现。

好了,现在我们来具体实现这个日期联动下拉菜单。

联动下拉菜单是以两个或多个select元素为单位的,为了让这些菜单更多紧密的工作,我们可以实现一个类用来管理它们的初始化、事件,在这里就使用DateSelector为类名,它有三个属性,分别为年、月、日的下拉菜单,而这三个select元素是由构造函数的参数传进来的,另外为了更灵活地使用它,我们还可以再给DateSelector类的构造函数增加一个(Date对象)或三个参数(int数值),表示初始化的年月日。由于参数个数不定,我们可以不将另外增加的参数写入参数表里,而是在运行时判断arguments对象的length属性来执行不同的操作。arguments对象存储了当前函数的参数信息,可以查阅一下相关的资料比如说《Windows脚本技术》。

如何实现一个日期下拉菜单

function DateSelector(selYear, selMonth, selDay)

{

this.selYear = selYear;

this.selMonth = selMonth;

this.selDay = selDay;

}

接下来开始对联动菜单进行初始化,首先是年份,我们可以给类增加一个MinYear属性表示最小的年份,再增加一个MaxYear表示最大的年份,实现一个InitYearSelect方法初始化年份,实现一个InitMonthSelect方法初始化月份。由于这几个属性和方法的思路都是很简单,就不一一讲解,看看代码是怎么写的应该就能够明白,如果对类方面有不清楚有地方可以参考我发表在无忧脚本另一篇文章《由浅到深了解JavaScript类》。

如何实现一个日期下拉菜单

function DateSelector(selYear, selMonth, selDay)

{

this.selYear = selYear;

this.selMonth = selMonth;

this.selDay = selDay;

this.InitYearSelect();

this.InitMonthSelect();

}

// 增加一个最大年份的属性

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);

}

}

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);

接下来要对天数进行初始化了,前边有说过天数是不定的,那要如何准确求出它的天数呢?我们稍加分析就知道每个月的最后一天就是该月的天数,相当于下一个月的第一天的前一天,比如说我们要求2005年11月的天数,那我们只需要得到2005年12月一日的前一天即可得到2005年11月最后一天。可以给DateSelector添加一个方法DaysInMonth来实现该功能。

如何实现一个日期下拉菜单

function DateSelector(selYear, selMonth, selDay)

{

this.selYear = selYear;

this.selMonth = selMonth;

this.selDay = selDay;

this.InitYearSelect();

this.InitMonthSelect();

}

// 增加一个最大年份的属性

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();

}

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);

alert("2004年2月的天数为" + DateSelector.DaysInMonth(2004, 2));

alert("2005年2月的天数为" + DateSelector.DaysInMonth(2005, 2));

很明显,这种方法根本不需要考虑到该年份是否为闰年就可以轻松求出指定月的天数。另外,有些网友可能会对“var date = new Date(year, month, 0);”这句代码觉得奇怪,传入的是2005,2,0,这看起来似乎是求二月份第一天的前一天即一月份的最后一天,为什么还会得到二月份的天数?这里必须说明一天,JavaScript的Date对象里的月份是由0开始到11结束,也就是说0表示一月,2表示三月,所以就有这种错觉,在使用JavaScript的Date对象时要特别注意这一点。

出处:蓝色理想

责任编辑:moby

◎进入论坛网页制作、网站综合版块参加讨论

<HTML> <HEAD> <title>年月日三联动下拉</title> <meta http-equiv='Content-Type' content='text/html; charset=gb2312'> <meta name='author' content='http://singlepine.cnblogs.com/'> </HEAD> <body> <form name="form1"> 请选择选择选择 日 </form> [removed]<!-- function YYYYMMDDstart() { MonHead = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; //先给年下拉赋内容 var y = new Date().getFullYear(); for (var i = (y-30); i < (y+30); i++) //以今年为准,前30年,后30年 document.form1.YYYY.options.add(new Option(" "+ i +" 年", i)); //赋月份的下拉 for (var i = 1; i < 13; i++) document.form1.MM.options.add(new Option(" " + i + " 月", i)); document.form1.YYYY.value = y; document.form1.MM.value = new Date().getMonth() + 1; var n = MonHead[new Date().getMonth()]; if (new Date().getMonth() ==1 && IsPinYear(YYYYvalue)) n++; writeDay(n); //赋日期下拉 document.form1.DD.value = new Date().getDate(); } if(document.attachEvent) window.attachEvent("onload", YYYYMMDDstart); else window.addEventListener('load', YYYYMMDDstart, false); function YYYYDD(str) //年发生变化时日期发生变化(主要是判断闰平年) { var MMvalue = document.form1.MM.options[document.form1.MM.selectedIndex].value; if (MMvalue == ""){ var e = document.form1.DD; optionsClear(e); return;} var n = MonHead[MMvalue - 1]; if (MMvalue ==2 && IsPinYear(str)) n++; writeDay(n) } function MMDD(str) //月发生变化时日期联动 { var YYYYvalue = document.form1.YYYY.options[document.form1.YYYY.selectedIndex].value; if (YYYYvalue == ""){ var e = document.form1.DD; optionsClear(e); return;} var n = MonHead[str - 1]; if (str ==2 && IsPinYear(YYYYvalue)) n++; writeDay(n) } function writeDay(n) //据条件写日期下拉 { var e = document.form1.DD; optionsClear(e); for (var i=1; i<(n+1); i++) e.options.add(new Option(" "+ i + " 日", i)); } function IsPinYear(year)//判断是否闰平年 { return(0 == year%4 && (year0 !=0 || year@0 == 0)); } function optionsClear(e) { e.options.length = 1; } //--> [removed] </body> </HTML>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值