当前位置:   article > 正文

你的生日是星期几?HTML+JavaScript帮你列出来

你的生日是星期几?HTML+JavaScript帮你列出来

0 源起


上周末,大宝发现今年自己的生日不是周末,这样就不好约同学和好友一起开生日Party了,很是郁闷。一直嘀咕自己哪年的生日才是周末。
于是我用JavaScript写了一个小程序来帮她测算了未来100年中每年的生日分别是星期几。

1 设计交互界面


用一个文本框来输入年份,
一个下拉列表框来选择月份,
一个下拉列表框来选择日,
一个按钮来进行测算,
一个多行文本输入框来显示测算结果。

  1. <p>你的生日是星期几?</p>
  2. <p>请输入生日信息</p>
  3. <input type="text" id="txtYear" value="2024"><select id="lsbMonth"></select><select id="lsbDay"></select>
  4. <input type="button" value="测算" id="btnCheck">
  5. <p><textarea id="taResult" rows="15" cols="60"></textarea></p>

主打简洁,如下图:

2 输入控制

2.1 年份文本框只允输入4位整数

 当用户修改年份文本框中的内容,导致文本框的值发生改变时,会触发oninput事件,我们对这个事件进行处置,只允许输入数字,并且只保留前4位数字。

  1. //年份输入处理
  2. function txtYear_onInput()
  3. {
  4. var a = txtYear.value.replace(/[^\d]/g,'');//只允许输入数字
  5. txtYear.value = a.substr(0,4);//只允许四位数字
  6. } // txtYear_onInput()
  7. txtYear.oninput = function() {txtYear_onInput()};

2.2 月份列表框

一年12个月,用一个函数来填充其值。

  1. //初始化月份
  2. function lsbMonth_Init()
  3. {
  4. for (var i=1;i<13; i++)
  5. {
  6. lsbMonth.options[i-1] = new Option(i, i, true, true);
  7. }
  8. lsbMonth.selectedIndex = 0;
  9. }//lsbMonth_Init();
  10. lsbMonth_Init();

2.3 日列表框

每年的1月、3月、5月、7月、8月、10月、12月是31天。

每年的14月、6月、9月、11月是30天。

2月特殊一些,平年是28天,闰年是29天。

我们先初始化日列表框为31天。

  1. //初始化“日”下拉列表框
  2. function lsbDay_Init()
  3. {
  4. for (var i = 0;i < 31; i++)
  5. {
  6. lsbDay.options[i] = new Option(i+1,i+1,true,true);
  7. }
  8. lsbDay.selectedIndex = 0;
  9. }//lsbDay_Init();
  10. lsbDay_Init();

当用户修改年份时,会触发onchange事件,

当用户修改月份时,也会触发onchange事件,

我们对这两个事件进行处理:

  1. 先获取年份和月份的值,
  2. 如果用户选择的是2月,就判断用户选择的年份是平年还是闰年,平年就是28天,闰年就29天。
  3. 如果用户选择的是1月、3月、5月、7月、8月、10月或12月,那么就是31天,否则就是30天。
  4. 根据测算出来的天数调整日列表框的值。
  1. //获取年份
  2. function txtYear_getYear()
  3. {
  4. return txtYear.value;
  5. //return document.getElementById("txtYear").value;
  6. }
  7. //alert(txtYear_getYear())
  8. //获取月份
  9. function lsbMonth_getMonth()
  10. {
  11. return lsbMonth.options[lsbMonth.selectedIndex].value;
  12. }
  13. //判断是否为闰年
  14. function isLeapYear(y)
  15. {
  16. return (y % 4 == 0 && y % 100 !=0 || y % 400 == 0);
  17. }
  18. //根据用户输入的年份和月份,动态调整“日”下拉列表框的内容
  19. function lsbDay_Adjust()
  20. {
  21. var s = lsbDay.selectedIndex;
  22. //alert('typeof s='+ typeof(s)+ ' s='+s);
  23. var y = txtYear_getYear();
  24. //alert('y='+y);
  25. if (y <= 0)
  26. {
  27. alert("请先输入年份");
  28. return;
  29. }
  30. var m = lsbMonth_getMonth();
  31. //alert('m='+ m);
  32. var d;
  33. if (2==m)
  34. {
  35. d = isLeapYear(y) ? 29 : 28;
  36. }
  37. else
  38. {
  39. d = (m==1 || m==3 || m==5 | m==7 || m==8 || m==10 || m==12 ? 31 : 30);
  40. }
  41. //alert('d='+d);
  42. lsbDay.options.length = d;
  43. //alert('lsbDay.options.length='+lsbDay.options.length);
  44. for (var i = 0;i < d; i++)
  45. {
  46. lsbDay.options[i] = new Option(i+1,i+1,true,true);
  47. }
  48. lsbDay.selectedIndex = s < d ? s : 0;
  49. }//lsbDay_Adjust();
  50. txtYear.oninput = function() {txtYear_onInput()};
  51. txtYear.onchange = function() {lsbDay_Adjust()};

2.4 测算按钮

获取年月日数值,使用日期对象的getFullYear() 方法生成一个日期,然用利用日期对象的getDay() 方法返回指定日期是星期几,把结果填入测算结果。

  1. btnCheck.onclick = function(){checkDay()};
  2. function lsbDay_getDay()
  3. {
  4. return lsbDay.options[lsbDay.selectedIndex].value;
  5. }
  6. function checkDay()
  7. {
  8. var a = new Date();
  9. var y = txtYear_getYear(), m = lsbMonth_getMonth(), d = lsbDay_getDay();
  10. var w, s, r = '';
  11. for (var i=0;i < 100;i++)
  12. {
  13. a.setFullYear(y*1+i ,m-1,d);
  14. w = a.getDay();
  15. s = '';
  16. //alert(a);
  17. r += a.getFullYear() + '年' + m + '月' + d + '日 是 星期' + "日一二三四五六".charAt(w) + '\n';
  18. } //for
  19. taResult.value = r;
  20. }

3 一些改进思路

1.初始化年月日时将默认值 设置系统当前日期

2.可以使用 date输入框:

 <input type="date" value="2024-06-01">

3.使用<iframe>代替<textarea>,对周日——周六分别用不同的颜色来显示。

 

4.用户界面上可以加上一个生日蛋糕之类的图片烘托氛围。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/876623
推荐阅读
相关标签
  

闽ICP备14008679号