JavaScriptの練習:カレンダーちょっと改良

カレンダーは月末日が表示されないというバグがあることに気づいたので、直すついでに、当初作ってみたかったようにやってみた。
成果物はこちら
最初は、thimbleで作業していたが、thimbleは「new Date(2018,1,31,0,0,0)」と日時を指定しても、現在の日時になってしまうことがわかった。Playcodeも同じみたいだった。日本標準時の扱いにくさもあって、ThimbleやPlaycodeに依存しない、VS Code+Chromeという標準的な開発環境に落ち着いたこともメモしておきます。

コードは、入力エラーチェックも入れて、多少スッキリしたような気がします。
index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Calendar</title>
    <!-- <link> タグを HTML ファイルに追加します。通常は <head> タグ内に置かれます -->
    <link href="style.css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
  </head>
  <body>
    <div>
      <input id="year1" type="text" maxlength="4" pattern="^[0-9]+$" size="4" min="1970">
      <label for="year1">年</label>
      <input id="month1" type="text" maxlength="2" pattern="^[0-9]+$" size="2" max="12">
      <label for="month1">月</label>
      <button class="setcal1">Set Calendar</button>
    </div>
    <p class="target"></p>
    <table id="table">
    </table>

    <script src="script.js"></script>
  </body>
</html>

style.css

/* Fonts from Google Fonts - more at https://fonts.google.com */
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
@import url('https://fonts.googleapis.com/css?family=Merriweather:400,700');

body {
  background-color: white;
  font-family: "Open Sans", sans-serif;
  padding: 5px 25px;
  font-size: 18px;
  margin: 0;
  color: #444;
}

h1 {
  font-family: "Merriweather", serif;
  font-size: 32px;
}

table {
  text-align: center;
  width: 490px;
  border: 1px;
  border-color: black;
}

.target{
  padding-top: 5px;
  padding-bottom: 5px;
}

.sun {
  color: red;
  background-color: lightpink;
}

.sat {
  color: darkblue;
  background-color: lightblue;
}

.notThisMonth {
  color:darkgray;
  background-color: lightgray;
}

.sunNotThisMonth {
  color: rgba(148, 53, 53, 0.8);
  background-color: rgba(148, 53, 53, 0.3)
}

.satNotThisMonth {
  color: rgba(38, 38, 168, 0.8);
  background-color: rgba(38, 38, 168, 0.3);
}

script.js

var myTarget = document.querySelector('.target');
var cmdSetCal1 = document.querySelector('.setcal1');
var myYear = document.getElementById('year1');
var myMonth = document.getElementById('month1');
var myTable = document.getElementById('table');
var day1 = new Date();
myYear.value = day1.getFullYear();
myMonth.value = day1.getMonth()+1;

function setCal1(){
  var numYear = myYear.value;
  var numMonth = myMonth.value;
  var dayStart = new Date(numYear,numMonth-1,1,0,0,0,0);
  console.log('dayStart:' + dayStart);
  if (dayStart.toString() === "Invalid Date") {
    alert('Please input correct year and month');
    return;
  }
  day1 = new Date(numYear,numMonth-1,1,0,0,0,0);
  day1.setDate(dayStart.getDate() - dayStart.getDay());
  console.log('day1:' + day1);
  myTarget.textContent = numYear + "年" + numMonth + "月";
  var booLoop = true;
  myTable.innerHTML = '';
  var row = myTable.insertRow(-1);
  var myHTML = '<th class="sun">日</th><th class="week">月</th><th class="week">火</th><th class="week">水</th><th class="week">木</th><th class="week">金</th><th class="sat">土</th>';
  row.innerHTML = myHTML;
  do {
    row = myTable.insertRow(-1);
    myHTML = "";
    var i;
    for (i=0; i<7; i++){
      if (day1.getMonth() != numMonth-1){
        if (i==0){
          myHTML += '<td class="sunNotThisMonth">' + day1.getDate() + '</td>';
        } else if (i === 6){
          myHTML += '<td class="satNotThisMonth">' + day1.getDate() + '</td>';
        } else {
          myHTML += '<td class="notThisMonth">' + day1.getDate() + '</td>';
        }
      } else {
        if (i==0){
          myHTML += '<td class="sun">' + day1.getDate() + '</td>';
        } else if (i === 6){
          myHTML += '<td class="sat">' + day1.getDate() + '</td>';
        } else {
          myHTML += '<td class="week">' + day1.getDate() + '</td>';        }
      }
      day1.setDate(day1.getDate()+1);
      //console.log(day1);
    }
    row.innerHTML = myHTML;
    if (day1.getMonth() != dayStart.getMonth()) {
      booLoop = false;
    }
  } while (booLoop);
}

cmdSetCal1.addEventListener('click', setCal1);

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.