分享
 
 
 

实现一个日期下拉菜单

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

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

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

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

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

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

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

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

}

</script>

</head>

<body>

</body>

</html>

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

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

}

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

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

}

}

</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>

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

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

}

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

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

}

</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.getElement

[1] [2] [3] [4] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有