基于javascript编写简单日历


Posted in Javascript onMay 02, 2016

一.表格行数问题

     既然要显示日期表格的话,首先得知道这个表格有多少行多少列,列数是已经确定的,从星期天(日历上第1列是星期天)到星期六一共7列。要解决行数问题之前,还得先知道这个月的第1天是星期几,因为每个月的1号并不都是从日历上的星期天开始排的,可能1号是星期五,星期六也说不定,所以1号的左边部分,就得用空表格代替了。那么用多少个空表格代替呢,这里就得用到getDay()方法了,该方法返回数组[0-6]中的一个数字,0代表星期天,1代表星期一,2代表星期二,以此类推。所以如果一个月的1号是星期五的话,那么刚好左边需要5个空表格代替。然后,假如一个月有31天,最后求出的表格行数就是:

var tr_nums = Math.ceil((5 + 31)/7); 

    当然,并不是每个月都是31天,所以我们得创建一个包含12个月份的数组,每个元素代表每个月份所包含的天数。但是2月份比较特殊,闰年的2月份有29天,平年的2月份只有28天。所以,在创建数组之前,得自己创建一个判断闰年的函数:

//如果当前年份能被4整除但是不能被100整除或者能被400整除,即可确定为闰年,返回1,否则返回0
 function isLeap(year) {
 return year % 4 == 0 ? (year % 100 != 0 ? 1 : (year % 400 == 0 ? 1 : 0)) : 0;
 }

然后我们创建一个月份数组: 

var days_per_month = new Array(31, 28 + isLeap(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 这样就能保证无论是平年还是闰年都会取出正确的天数,下面的代码用于获取今天的相关信息:
var today = new Date(),       //获取当前日期
   y = today.getFullYear(),     //获取日期中的年份
   m = today.getMonth(),      //获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1)
   d = today.getDate(),       //获取日期中的日(方便在建立日期表格时高亮显示当天)
   firstday = new Date(y, m, 1),  //获取当月的第一天
   dayOfWeek = firstday.getDay(),  //判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推)
   days_per_month = new Array(31, 28 + isLeap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), //创建月份数组

所以最后就可以获取当月所需表格的行数:

 var str_nums = Math.ceil((dayOfWeek + days_per_month[m]) / 7); //确定日期表格所需的行数 

二.打印日历表格

表格本身是一个二维数组,所以让for大师出来跑两个循环就搞定啦,代码如下:

for (i = 0; i < str_nums; i += 1) {   //第一层for循环创建tr标签
  document.write('<tr>');
  for (k = 0; k < 7; k++) {      //第二层for循环创建td标签
   var idx = 7 * i + k;        //为每个表格创建索引,从0开始
   var date = idx - dayOfWeek + 1;  //将当月的1号与星期进行匹配
   //do something else
  }
  document.write('</tr>');
  }
 

三.附上完整的js日历代码

<script>
  //判断当前年份是否是闰年(闰年2月份有29天,平年2月份只有28天)
  function isLeap(year) {
  return year % 4 == 0 ? (year % 100 != 0 ? 1 : (year % 400 == 0 ? 1 : 0)) : 0;
  }
  var i, k,
  today = new Date(),                 //获取当前日期
  y = today.getFullYear(),              //获取日期中的年份
  m = today.getMonth(),                //获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1)
  d = today.getDate(),                //获取日期中的日(方便在建立日期表格时高亮显示当天)
  firstday = new Date(y, m, 1),            //获取当月的第一天
  dayOfWeek = firstday.getDay(),           //判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推)
  days_per_month = new Array(31, 28 + isLeap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),         //创建月份数组
  str_nums = Math.ceil((dayOfWeek + days_per_month[m]) / 7);                        //确定日期表格所需的行数
  document.write("<table cellspacing='0'><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>"); //打印表格第一行(显示星期)
  for (i = 0; i < str_nums; i += 1) {         //二维数组创建日期表格
  document.write('<tr>');
  for (k = 0; k < 7; k++) {
   var idx = 7 * i + k;                //为每个表格创建索引,从0开始
   var date = idx - dayOfWeek + 1;          //将当月的1号与星期进行匹配
   (date <= 0 || date > days_per_month[m]) ? date = ' ': date = idx - dayOfWeek + 1;  //索引小于等于0或者大于月份最大值就用空表格代替
   date == d ? document.write('<td class="today">' + date + '</td>') : document.write('<td>' + date + '</td>');  //高亮显示当天
  }
  document.write('</tr>');
  }
  document.write('</table>');
 </script>

css部分大家就自由发挥吧,当前时间是2016年5月2号,效果图如下:

基于javascript编写简单日历

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
javascript 支持ie和firefox杰奇翻页函数
Jul 22 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
Jun 17 Javascript
老生常谈js动态添加事件--- 事件委托
Jul 19 Javascript
详解如何使用 vue-cli 开发多页应用
Dec 16 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
解决Mac node版本升级失败的问题
May 16 Javascript
微信小程序实现简单跑马灯效果
May 26 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
Javascript实现鼠标移入方向感知
Jun 24 Javascript
Bootstrap媒体对象的实现
May 01 #Javascript
Bootstrap进度条组件知识详解
May 01 #Javascript
BootStrap glyphicons 字体图标实现方法
May 01 #Javascript
JS实现左右无缝轮播图代码
May 01 #Javascript
JavaScript中的继承之类继承
May 01 #Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 #Javascript
js判断手机浏览器操作系统和微信浏览器的方法
Apr 30 #Javascript
You might like
PHP在线打包下载功能示例
2016/10/15 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
checkbox使用示例
2013/08/23 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
学校十一活动方案
2014/02/01 职场文书
房地产财务管理制度
2014/02/02 职场文书
中年人生感言
2014/02/04 职场文书
二手房买卖协议书
2014/04/10 职场文书
学会感恩主题班会
2015/08/12 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书