您的位置: 首页 > 技术文档 > 网页制作 > 实现一个日期下拉菜单
静态网页加密 回到列表 js“树”读取xml数据
 实现一个日期下拉菜单

作者:Qihontin 时间: 2006-01-13 文档类型:原创 来自:蓝色理想

第 1 页 实现一个日期下拉菜单 [1]
第 2 页 实现一个日期下拉菜单 [2]
第 3 页 实现一个日期下拉菜单 [3]

这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。本文调试环境为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.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));
</script>
</body>
</html>

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

出处:蓝色理想
责任编辑:moby

上一页 下一页 实现一个日期下拉菜单 [2]

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

相关文章 更多相关链接
基于 Ajax 的无限级菜单
flash8与javascript集成
web关联菜单实现方法
手机GUI二级菜单设计说明
JavaScript实用的一些技巧
热门搜索:CSS Fireworks 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
Photoshop绘制真实的黑莓手机
标记语言——为文字指定样式
NewWebPick第17期专业版发布
php设计模式介绍之装饰器模式
Windows组策略之软件限制策略
大木花谷
疯狂的程序员 第二十五回
疯狂的程序员 第二十四回
IE下中英文字体不能对齐原因及解决
有些标志很类似
栏目最新 栏目最新列表
火星人的耳机
公司正式宣布创业失败
用corelDEAW 12打造唇膏
二行代码解决全部网页木马
一行代码解决iframe挂马
Photoshop制作星空爆炸效果
CorelDraw 12打造休闲裤
Firework如何画特殊的切角图形
Firework打造韩式风格的手提袋
flash实例:打造佛光效果
 
>> 分页 首页 前页 后页 尾页 页次:1/31个记录/页 转到 页 共3个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

本文现有 3 条评论 暂时没有人参与评分


Qihontin Publish at 2006-2-6 12:21:28
不会啊,我再试了一下,楼上两位朋友说的情况都没出现
leady27 Publish at 2006-1-16 21:41:50
其它的也有问题..还是我设得不对??
我是用以下的方法:

// 也可以试试下边的代码
var dt = new Date(2004, 1, 29);
new DateSelector(selYear, selMonth ,selDay, dt);
leady27 Publish at 2006-1-16 21:39:43
BUG ???
我发现四月份怎么只有29啊..
您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
大师之路--Photoshop 完全解析
《超越CSS》新书上市
Don't Make Me Think 第2版
HTML与CSS入门经典(第7版)
《FLASH MX2004网站开发精粹》
《CSS入门经典》
《设计师谈网页设计思维》
作品集 更多内容

股甲天下推广页面 我喜欢PS 华视传媒网站首页 标志设计 汤加丽时尚美业 Icons&nbsp;For&nbsp;FVS&nbsp;Cool&nbsp;Writer 陈旭麓先生网站设计 demo