>웹 프론트엔드 >JS 튜토리얼 >javascript_javascript 기술을 기반으로 간단한 달력 작성

javascript_javascript 기술을 기반으로 간단한 달력 작성

WBOY
WBOY원래의
2016-05-16 15:02:441376검색

1. 테이블 행 수 문제

날짜 테이블을 표시하려면 먼저 테이블에 행과 열이 몇 개 있는지 알아야 합니다. 열의 개수는 일요일부터 총 7개입니다(달력의 첫 번째 열은 일요일입니다.) ) 토요일까지. 행 번호 문제를 풀기 전에 먼저 이번 달의 첫 번째 날이 무슨 요일인지 알아야 합니다. 왜냐하면 매월 첫 번째 날은 달력상 항상 일요일부터 시작되지 않기 때문입니다. 첫 번째 날은 금요일일 수도 있고 토요일일 수도 있습니다. 불확실하므로 1번의 왼쪽 부분을 빈 형태로 대체해야 합니다. 그러면 이를 대체하려면 몇 개의 빈 테이블을 사용해야 합니까? 이 메소드는 배열에 숫자를 반환합니다. 0은 일요일을 나타내고, 1은 화요일을 나타냅니다. 에. . 따라서 매월 1일이 금요일이면 왼쪽에 5개의 빈 테이블이 필요합니다. 그런 다음 한 달이 31일인 경우 테이블 행의 최종 수는 다음과 같습니다.

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

물론 매달 31일이 있는 것은 아니므로 12개월을 포함하는 배열을 만들어야 하며, 각 요소는 각 달에 포함된 일 수를 나타냅니다. 하지만 윤년의 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) //날짜 테이블에 필요한 행 수 결정

2. 달력 양식 인쇄

테이블 자체는 2차원 배열이므로 for master가 두 개의 루프를 실행하게 하면 코드는 다음과 같습니다.

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>');
  }

3. 전체 js 캘린더 코드가 첨부되어 있습니다

<script>
  //判断当前年份是否是闰年(闰年2月份有29天,平年2月份只有28天)
  function isLeap(year) {
  return year % 4 == 0 &#63; (year % 100 != 0 &#63; 1 : (year % 400 == 0 &#63; 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]) &#63; date = ' ': date = idx - dayOfWeek + 1;  //索引小于等于0或者大于月份最大值就用空表格代替
   date == d &#63; document.write('<td class="today">' + date + '</td>') : document.write('<td>' + date + '</td>');  //高亮显示当天
  }
  document.write('</tr>');
  }
  document.write('</table>');
 </script>
 

CSS 부분을 자유롭게 플레이해 보세요. 현재 시간은 2016년 5월 2일입니다. 렌더링은 다음과 같습니다.

이상 내용이 이 글의 전체 내용입니다. 자바스크립트 프로그래밍을 배우시는 모든 분들께 도움이 되었으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.