前言

方法是有参考网上一些资料的,比如闰年的判断,比如每个月第一天是星期几的判断。不说太多,拆分出一个个函数,希望能描述尽可能的清晰明了。

一,判断闰年

  1. //判断闰年
  2. function runNian(_year) {
  3. if(_year% === || (_year% === && _year% !== ) ) {
  4. return true;
  5. }
  6. else { return false; }
  7. }

二,判断某年某月的1号是星期几

  1. //判断某年某月的1号是星期几
  2. function getFirstDay(_year,_month) {
  3. var allDay = , y = _year-, i = ;
  4. allDay = y + Math.floor(y/) - Math.floor(y/) + Math.floor(y/) + ;
  5. for ( ; i<_month; i++) {
  6. switch (i) {
  7. case : allDay += ; break;
  8. case :
  9. if(runNian(_year)) { allDay += ; }
  10. else { allDay += ; }
  11. break;
  12. case : allDay += ; break;
  13. case : allDay += ; break;
  14. case : allDay += ; break;
  15. case : allDay += ; break;
  16. case : allDay += ; break;
  17. case : allDay += ; break;
  18. case : allDay += ; break;
  19. case : allDay += ; break;
  20. case : allDay += ; break;
  21. case : allDay += ; break;
  22. }
  23. }
  24. return allDay%;
  25. }

三,创建日历表格,显示日历(表格应该在静态页面先写好结构和样式,然后在此处拼接,这里仅做示范,不附样式)

  1. //显示日历
  2. function showCalendar(_year,_month,_day,firstDay) {
  3. var i = ,
  4. monthDay = ,
  5. showStr = "",
  6. _classname = "",
  7. today = new Date();
  8. //月份的天数
  9. switch(_month) {
  10. case : monthDay = ; break;
  11. case :
  12. if(runNian(_year)) { monthDay = ; }
  13. else { monthDay = ; }
  14. break;
  15. case : monthDay = ; break;
  16. case : monthDay = ; break;
  17. case : monthDay = ; break;
  18. case : monthDay = ; break;
  19. case : monthDay = ; break;
  20. case : monthDay = ; break;
  21. case : monthDay = ; break;
  22. case : monthDay = ; break;
  23. case : monthDay = ; break;
  24. case : monthDay = ; break;
  25. }
  26.  
  27. //输出日历表格,这部分因结构而异
  28. showStr = "<table class='cld-w'><thead>";
  29. //日历头部
  30. showStr += "<tr><th colspan='7'><div class='cld-hd'><span class='cld-pre'>&lt;</span><em id='showDate' value='" + _year + "-" + _month + "-" + _day + "'>" + _year + "年" + _month + "月" + _day + "日" + "</em><span class='cld-next'>&gt;</span></div></th></tr>";
  31. //日历星期
  32. showStr += "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>";
  33. showStr += "</thead><tbody><tr>";
  34. //当月第一天前的空格
  35. for (i=; i<=firstDay; i++) {
  36. showStr += "<td></td>";
  37. }
  38. //显示当前月的天数
  39. for (i=; i<=monthDay; i++) {
  40. //当日的日期
  41. if(_year === today.getFullYear() && _month === today.getMonth()+ && i === today.getDate()) {
  42. _classname = "cld-cur";
  43. }
  44. //当日之前的日期(这个判断是因为我有工作需求,就是要求之前的日期不能点击)
  45. else if(_year < today.getFullYear() || (_year === today.getFullYear() && _month <= today.getMonth()) || (_year === today.getFullYear() && _month === today.getMonth()+ && i < today.getDate()) ) {
  46. _classname = "cld-old";
  47. }
  48. //其他普通的日期
  49. else { _classname = "cld-day"; }
  50. //其他大于当月的月份的相同日期(为了让点击下一月的时候,相同的日期增加cld-cur类)
  51. if(_day === i && (_year > today.getFullYear() || _month > today.getMonth()+)) { _classname = "cld-cur"; }
  52. //把日期存在对应的value
  53. showStr += "<td class=" + _classname + " value='" + _year + "-" + _month + "-" + i + "'>" + i + "</td>";
  54.  
  55. firstDay = (firstDay+)%;
  56. if(firstDay === && i !== monthDay) {
  57. showStr += "</tr><tr>";
  58. }
  59. }

  60. //剩余的空格
  61. if(firstDay!==) {
  62. for (i=firstDay; i<; i++) {
  63. showStr += "<td></td>";
  64. }
  65. }
  66.  
  67. showStr +="</tr></tbody></table>";
  68. //插入calendar的页面结构里
  69. calendar.innerHTML = showStr;
  70. }

四,在日历的头部显示当前的年月日

  1. //显示年月日
  2. function showDate(_year,_month,_day) {
  3. var date = "", firstDay = getFirstDay(_year,_month,_day);
  4. if(_day !== ) {
  5. date = _year + "年" + _month + "月" +_day + "日";
  6. }
  7. else { date = "No Choose."; }
  8. document.getElementById("showDate").innerHTML = date; //日历头部显示
  9. showCalendar(_year,_month,_day,firstDay); //调用日历显示函数
  10. }

五,上一月和下一月

  1. //上一月
  2. function preMonth(_year,_month,_day) {
  3. if(_month == ) { showDate(_year - ,,_day); }
  4. else { showDate(_year,_month - ,_day); }
  5. }
  6. //下一月
  7. function nextMonth(_year,_month,_day) {
  8. if(_month == ) { showDate(_year + ,,_day); }
  9. else { showDate(_year,_month + ,_day); }
  10. }

六,初始化,日历就出来了

  1. //初始化
  2. var calendar = document.createElement('div');
  3. calendar.setAttribute('id','showCld');
  4. document.getElementById("box").appendChild(calendar); //增加到你的box里

  5. //获取当天的年月日
  6. var today = new Date();
  7. var _year = today.getFullYear(),
  8. _month = today.getMonth() + ,
  9. _day = today.getDate();
  10. var firstDay = getFirstDay(_year,_month);
  11.  
  12. //显示日历
  13. showCalendar(_year,_month,_day,firstDay);

七,日历的点击事件

  1. //日历点击的事件委托(可以查查js冒泡的应用)
  2. calendar.onclick = function(e) {
  3. var e = e || window.event;
  4. var target = e.srcElement || e.target;
  5. //把日历的头部的年月日分割成数组,这里保存在其value属性上
  6. dayArr = document.getElementById('showDate').getAttribute('value').split('-');
  7. if (target) {
  8. //如果是可点击的日期
  9. if ( target.className === "cld-day" || target.className === "cld-cur" ) {
  10. dateArr = target.getAttribute('value').split('-');
  11. //减0是把字符串转化成数值类型,以下一样
    showDate(dateArr[0]-0,dateArr[1]-0,dateArr[2]-0);
  12. calendar.className = "";
  13. }
  14. //如果是上一月的点击
  15. else if ( target.className === "cld-pre" ) {
  16. preMonth(dayArr[]-,dayArr[]-,dayArr[]-);
  17. }
  18. //如果是下一月的点击
  19. else if ( target.className === "cld-next" ) {
  20. nextMonth(dayArr[]-,dayArr[]-,dayArr[]-);
  21. }
  22. }
  23. };

——把解释都写着代码里了,代码函数比较简单粗暴,没办法,本人对js继承封装还不熟呢。

创建一个js日历(原生JS实现日历)的更多相关文章

  1. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  2. JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)

    JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...

  3. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  4. 一个简单用原生js实现的小游戏----FlappyBird

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...

  5. jQuery跳转到另一个页面以及原生js跳转到另一个页面

    1.原生js我们可以利用http的重定向来跳转 window.location.replace("https://www.cnblogs.com/pythonywy/"); 2.原 ...

  6. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  7. 如何创建一个客户端回调:js获得服务端的内容?

    答案:表面上看去就是前端的js调用服务的C#方法,本质就是ajax,通过XMLHttpRequest对象和服务端进行交互.回调:就说回过头来调用,按理说js是一种脚本语言,怎么能用来调用服务端的呢?就 ...

  8. 【原生js】原生js的省市区三级联动

    html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  9. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  10. 【原生js】原生js实现验证码短信发送倒计时

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. SpringMVC传参

    @Controller @RequestMapping("/user") public UserController extends BaseController{ @InitBi ...

  2. IE8升级新版Flash Player ActiveX14导致的discuz图片附件无法上传 解决方法

    架不住sb adobe的频繁升级提示,手欠升级到了了flash player 14,结果IE8下全部discuz论坛中都无法看到上传图片的button了 没办法,遇到问题就解决吧 刚好在解决IE11遇 ...

  3. bigdata_批量机器执行通用脚本

    经常有这样的场景,需要批量验证一些配置或者机器,执行一些命令.例如  echo $PATH  等等 这里分享一个批量执行脚本 脚本名称 deployCommnd.sh 运行demo : sh depl ...

  4. [全国首发]Swift视频教程

    我真的很抱歉,每个人,从7带班开始到现在,最后的成品带. 到了最新的版本号,Swift语言一直在更新,非常多写法都变了.大家能够加我私人微信:wanghj29,我会在朋友圈更新swift的最新动态.此 ...

  5. 使用Blend的一些问题

    原文:使用Blend的一些问题 WPF开发,界面处理首选Blend,如果你开发了两年WPF都没接触过blend(当然这种几率不高),或者你刚接触WPF,可以考虑使用Blend,这货也算得上一个神器,上 ...

  6. php_中替换换行符

    //php 有三种方法来解决 //1.使用str_replace 来替换换行 $str = str_replace(array("\r\n", "\r", &q ...

  7. linux_常用命令_(ls, lsof,nslookup)_查看文件按照时间排序

    平时收集些用到的命令 方便使用 1:  ls -lrt 按时间排序  展示 2:nslookup  查看dns解析 3:lsof -p 进程号 lsof `which httpd` //那个进程在使用 ...

  8. 使用javascript实现的一些功能

    原文:使用javascript实现的一些功能 今天学习了javascript中的事件,已经接近尾声,可以说明天跨入jquery的学习啦,学习了一周的javascript,感觉还没有掌握其中学习的微妙之 ...

  9. oracle删除重复记录,只保留rowid最小的记录

    初探oracle删除重复记录,只保留rowid最小的记录   如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种 ...

  10. Pointers to classes (From the note of my firend)

     Pointers to classes Objects can also be pointed to by pointers: Once declared, a class becomes a ...