前提・実現したいこと
javascriptでtodolistの作成をしています。
チェックボックスにチェックされている行を「選択削除」ボタンで削除したいです。html上から削除することは出来たのですが、「登録」ボタンを押すと削除される前に戻ってしまいます。恐らく配列から削除する処理ができていないからだと思いますが、その処理のやり方がわかりません。
発生している問題・エラーメッセージ
selectDelete.addEventListener('click', () =>{ var select = document.getElementsByName("targetitems"); console.log(todolists); for(let i=0; i<select.length; i++){ if(select[i].checked){ console.log(select[i].parentNode.parentNode); var el = select[i].parentNode.parentNode; el.remove(); } } }); この部分に配列から削除する処理を追記したいです。
該当のソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css"></link> <title>Todolist</title> </head> <body> <header> <h1>Todolist</h1> </header> <div class="container"> <div class="main"> <!-- 登録内容入力 --> <div class="input-area"> <input id="todo" type="text" placeholder="予定"> <input id="money" type="text" placeholder="予算"> <input id="datetime" type="datetime-local"> <input id="place" type="text" placeholder="場所"> <input id="obj" type="text" placeholder="持ち物"> <input id="memo" type="text" placeholder="メモ"> </div> <!-- 登録、削除、一括削除ボタン --> <div class="btn-area"> <button id="addButton" class="btn-1">登録</button> <button id="allDelete" class="btn-2">全削除</button> <button id="selectDelete" class="btn-3">選択削除</button> </div> <!-- 表 --> <div class="table-area"> <form name="form1" action=""> <table border="1"> <thead> <th></th> <th>ID</th> <th>予定</th> <th>予算</th> <th>日時</th> <th>場所</th> <th>持ち物</th> <th>メモ</th> <th></th> </thead> <tbody id="tableBody"> </tbody> </table> </form> </div> </div class="main"> </div class="container"> <script src = "app.js"></script> </body> </html> 'use strict'; let todolists = []; const todo = document.getElementById('todo'); const money = document.getElementById('money'); const dt = document.getElementById('datetime'); const place = document.getElementById('place'); const obj = document.getElementById('obj'); const memo = document.getElementById('memo'); const addButton = document.getElementById('addButton'); const tableBody = document.getElementById('tableBody'); const allDelete = document.getElementById('allDelete'); const selectDelete = document.getElementById('selectDelete'); function formatDate(date){ var y = date.getFullYear() var m = ("00" + (date.getMonth() + 1)).slice(-2) var d = ("00" + date.getDate()).slice(-2) var hh = ("00" + date.getHours()).slice(-2) var mm = ("00" + date.getMinutes()).slice(-2) var ss = ("00" + date.getSeconds()).slice(-2) var result = y + "/" + m + "/" + d + " " + hh + ":" + mm + ":" + ss; return result }; addButton.addEventListener('click', () =>{ var datetime = document.getElementById('datetime'); console.log(datetime.value, 'datetime .value'); if(todo.value == ''){ alert('予定を入力してください'); return; }else{ let displayMoney = money.value == '' ? '0' : money.value; let displayDatetime = datetime.value == '' ? '' : formatDate(new Date(datetime.value)); const todoList = { todo: todo.value, money: displayMoney + '円', datetime: displayDatetime, place: place.value, obj: obj.value, memo: memo.value, }; if (todoList) { todolists.push(todoList); todo.value = ''; money.value = ''; datetime.value = ''; place.value = ''; obj.value = ''; memo.value = ''; showTodos(); }; }; }); const showTodos = () => { tableBody.textContent = ''; todolists.forEach((todolist, number) => { const tableRecord = document.createElement('tr'); tableBody.appendChild(tableRecord); const tableCheck = document.createElement('td'); const tableId = document.createElement('td'); const tableTodo = document.createElement('td'); const tableMoney = document.createElement('td'); const tableDatetime = document.createElement('td'); const tablePlace = document.createElement('td'); const tableObj = document.createElement('td'); const tableMemo = document.createElement('td'); const tableAction = document.createElement('td'); tableId.textContent = number + 1; tableTodo.textContent = todolist.todo; tableMoney.textContent = todolist.money; tableDatetime.textContent = todolist.datetime; tablePlace.textContent = todolist.place; tableObj.textContent = todolist.obj; tableMemo.textContent = todolist.memo; tableRecord.appendChild(tableCheck); tableRecord.appendChild(tableId); tableRecord.appendChild(tableTodo); tableRecord.appendChild(tableMoney); tableRecord.appendChild(tableDatetime); tableRecord.appendChild(tablePlace); tableRecord.appendChild(tableObj); tableRecord.appendChild(tableMemo); tableRecord.appendChild(tableAction); tableCheck.appendChild(createCheckbox(tableRecord)); tableAction.appendChild(createDeleteButton(tableRecord)); }); }; const createDeleteButton = (tableRecord) => { const index = tableRecord.rowIndex-1; const deleteButton = document.createElement('button'); deleteButton.textContent = '削除'; deleteButton.addEventListener('click', () => { console.log(index); todolists.splice(index, 1); showTodos() }); return deleteButton; }; const createCheckbox = () => { const checkbox = document.createElement('input'); checkbox.setAttribute('type', 'checkbox'); checkbox.setAttribute('name','targetitems'); return checkbox; }; allDelete.addEventListener('click', () =>{ todolists = []; showTodos(); }); selectDelete.addEventListener('click', () =>{ var select = document.getElementsByName("targetitems"); console.log(todolists); for(let i=0; i<select.length; i++){ if(select[i].checked){ console.log(select[i].parentNode.parentNode); var el = select[i].parentNode.parentNode; el.remove(); } } });
試したこと
該当する要素のインデックスを取得するやり方を調べてみたがわからなかった。
補足情報(FW/ツールのバージョンなど)
VS codeで書いています。
回答2件
あなたの回答
tips
プレビュー