纯JS实现出生日期[年月日]下拉菜单效果


Posted in Javascript onJune 01, 2018

在制作网页时,可能需要给用户提供注册帐号页面,用户注册 设计很多信息,其中就有 关于出生日期的,出于用户体验,不想让用户手动输入,而HTML5的date,目前很多浏览器支持的并不是很好,所以就可以用JS实现年、月、日3个下拉框的日期选择。具体代码如下:

1、新建一个js文件,如birthday.js;

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 = 1960;
// 增加一个最大年份的属性--最新年份,即当前时期getFullYear()
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;
}

2、在注册表单中的页面,引用刚才写的js

<script type="text/javascript" src="/js/birthday.js"></script>
<select id="selYear"></select>年
<select id="selMonth"></select>月
<select id="selDay"></select>日
<!--完成出生日期的选择--需写在</body>前-->
<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, 1995, 1, 17);
</script>
</body>
</html>

总结

以上所述是小编给大家介绍的纯JS实现出生日期[年月日]下拉菜单效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
JS多物体 任意值 链式 缓冲运动
Aug 10 Javascript
js模拟hashtable的简单实例
Mar 06 Javascript
用js传递value默认值的示例代码
Sep 11 Javascript
javascript实现状态栏中文字动态显示的方法
Oct 20 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
vue2过滤器模糊查询方法
Sep 16 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
JS轻量级函数式编程实现XDM二
Jun 16 Javascript
详解Angular操作cookies方法
Jun 01 #Javascript
浅谈手写node可读流之流动模式
Jun 01 #Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 #Javascript
基于JS实现带动画效果的流程进度条
Jun 01 #Javascript
说说node中的可读流和可写流的区别
Jun 01 #Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
Jun 01 #Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 #Javascript
You might like
php在线打包程序源码
2008/07/27 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
php绘制一条直线的方法
2015/01/24 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
python读取文件名称生成list的方法
2018/04/27 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
.NET面试10题
2014/02/24 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
临床医学专业毕业生的自我评价
2013/10/17 职场文书
生态学毕业生自荐信
2013/10/27 职场文书
初中新生军训方案
2014/05/13 职场文书
询价采购方案
2014/06/09 职场文书
2014年财务部工作总结
2014/11/11 职场文书
小学老师对学生的评语
2014/12/29 职场文书
内乡县衙导游词
2015/02/05 职场文书
幼师个人总结范文
2015/02/28 职场文书
大学生党课感想
2015/08/11 职场文书
Go使用协程交替打印字符
2021/04/29 Golang