初学者です。
javaScriptで会社の自動シフト作成表を作ってます。
カレンダーの次月と前月をクリックしたら前のカレンダーが残った状態なってしまいます。
前のカレンダーの表示を削除した上で次月、前月を表示したいです。
発生している問題・エラーメッセージ
function clearCalender() { //前のカレンダーを削除
const table = document.querySelector('.table1');
while (table.firstChild) {
table.removeChild(table.firstChild);
}
}
を使っても上手くいかず、最初に削除されてしまいます。
エラーメッセージ
### 該当のソースコード ```ここに言語を入力 コード ``` --CSS-- body { margin: 0; } .container { display: flex; justify-content: center; } .table1 { width: 80%; } .thisMonth { text-align: center; margin: 40px auto; } .sat { background-color: skyblue; } .sun { background-color: tomato; } #prev, #next { display: block; margin: auto; cursor: pointer; } .heading { display: flex; } .header { font-weight: bold; } .btn { margin-left: 150px; margin-bottom: 20px; } table, th, tr, td { border-collapse: collapse; border: 2px solid #333; } td { width: 53px; height: 28px; text-align: center; } #run { cursor: pointer; } #run:hover { opacity: 0.5; } tbody tr td { cursor: pointer; user-select: none; } --HTML-- <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Shift Creation</title> <link rel="stylesheet" href="css/styles.css"> </head> <body> <div class="heading"> <span id="prev">«</span> <h3 id="title" class="thisMonth"></h3> <span id="next">»</span> </div> <button id="run" class="btn">RUN</button> <div class="container" id="_container"> <table class="table1"> <thead> <tr id="calender"> <th rowspan="2">root</th> <th rowspan="2">name</th> </tr> <tr id="week"></tr> </thead> <tbody id="tbody1"> <tr id="row0"> <th>2009</th> <th>yu-ki</th> </tr> <tr id="row1"> <th>2010</th> <th>aya</th> </tr> <tr id="row2"> <th>2011</th> <th>rino</th> </tr> <tr id="row3"> <th>2012</th> <th>den</th> </tr> <tr id="row4"> <th>2014</th> <th>petie</th> </tr> <tr id="row5"> <th>STR</th> <th>tanaka</th> </tr> <tr id="row6"> <th>STR</th> <th>yoshida</th> </tr> </tbody> </table> <table class="table2"> <thead> <tr> <th height="60">P.H</th> </tr> </thead> <tbody id="tbody2"> <tr id="_row0"> <td id="phValue0">0</td> </tr> <tr id="_row1"> <td id="phValue1">0</td> </tr> <tr id="_row2"> <td id="phValue2">0</td> </tr> <tr id="_row3"> <td id="phValue3">0</td> </tr> <tr id="_row4"> <td id="phValue4">0</td> </tr> <tr id="_row5"> <td id="phValue5">0</td> </tr> <tr id="_row6"> <td id="phValue6">0</td> </tr> </tbody> </table> </div> <script src="js/main.js"></script> </body> </html> --javaScript-- 'use strict'; { const date = new Date(); let year = date.getFullYear(); let month = date.getMonth(); function clearCalender() { //前のカレンダーを削除 const table = document.querySelector('.table1'); while (table.firstChild) { table.removeChild(table.firstChild); } } function renderTitle() {//年月を表示 const title = document.getElementById('title'); title.textContent = `${year}/${String(month + 1).padStart(2, '0')}`; } function getCalender() { //日数分のセルを生成しtextContentで日付を入れる const lastDate = new Date(year, month + 1, 0).getDate(); for (let i = 1; i <= lastDate; i++) { const tdDate = document.createElement('td'); tdDate.textContent = i; document.getElementById('calender').appendChild(tdDate); if (new Date(year, month, i).getDay() === 6) { tdDate.classList.add('sat'); } if (new Date(year, month, i).getDay() === 0) { tdDate.classList.add('sun'); } }; } function getWeek() {//当月の曜日を取得しセルを生成 const lastDate = new Date(year, month + 1, 0).getDate(); for (let n = 1; n <= lastDate; n++) { const tdDay = document.createElement('td'); let wObj = ["日", "月", "火", "水", "木", "金", "土"][new Date(year, month, n).getDay()];//指定した日付の曜日を文字列で取得 tdDay.textContent = wObj; document.getElementById('week').appendChild(tdDay); if (tdDay.textContent==="土") { tdDay.classList.add('sat'); } if (tdDay.textContent==="日") { tdDay.classList.add('sun'); } }; } function addCell(id) {//シフト用のセルを生成 const lastDate = new Date(year, month + 1, 0).getDate(); for (let n = 1; n <= lastDate; n++) { const td = document.createElement('td'); td.textContent = '○'; document.getElementById(id).appendChild(td); td.addEventListener('click', () => { if (td.textContent==='○') { td.textContent = '休'; } else if (td.textContent==='休') { td.textContent = '○'; }; }); }; } function ph(rowId, phId) {//個人の休みをカウントする const row = document.getElementById(rowId); const td = row.querySelectorAll('td'); const phValue = document.getElementById(phId); let phCount = 0; // console.log(td); td.forEach(td => td.addEventListener('click', () => { if (td.textContent==='○') { phCount--; phValue.textContent = phCount; } else if (td.textContent==='休') { phCount++; phValue.textContent = phCount; }; })); } function bundling() { clearCalender(); renderTitle(); getCalender(); getWeek(); addCell('row0'); addCell('row1'); addCell('row2'); addCell('row3'); addCell('row4'); addCell('row5'); addCell('row6'); ph('row0', 'phValue0'); ph('row1', 'phValue1'); ph('row2', 'phValue2'); ph('row3', 'phValue3'); ph('row4', 'phValue4'); ph('row5', 'phValue5'); ph('row6', 'phValue6'); } document.getElementById('prev').addEventListener('click', () => { month--; if (month < 0) { year--; month = 11; } bundling(); }); document.getElementById('next').addEventListener('click', () => { month++; if (month > 11) { year++; month = 0; } bundling(); }); bundling(); }
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー