JavaScriptでTodoリストを作成しています。
todoリストのタスクをラジオボタンの全て、作業中、完了で表示・非表示を分けたいです。調べてコードを入力したのですが、
main.js: 79、87 Uncaught ReferenceError: workButton is not defined
at HTMLInputElement. (main.js:79,87)
※『if (workButton.innerHTML !== '作業中') 』
のエラーがなかなか解消できません。
色々調べて実装したのですが、これ以上積んでわからない状態です。
何方かアドバイスをお願いします。
期待する動作
① タスクの状態によって表示/非表示を切り替えできる
② 選択されたラジオボタンに応じて、タスクの表示を切り替える
③「作業中」選択時に特定のタスクの状態を作業中→完了に切り替えた場合、そのタスクが非表示になる。
④「完了」選択時に特定の特定のタスクの状態を完了→作業中に切り替えた場合、そのタスクが非表示になる。
⑤「作業中」選択時にタスクを新規追加した場合、タスクが表示される
⑥「完了」選択時にタスクを新規追加した場合、タスクは表示されない(が、裏ではちゃんと追加されている)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>課題③</title>
</head>
<body>
<h1>TODOリスト</h1>
<p class="radio">
<input type="radio" id="r1" name="list" value="1" checked><label for="r1">全て</label>
<input type="radio" id="r2" name="list" value="2"><label for="r2">作業中</label>
<input type="radio" id="r3" name="list" value="3"><label for="r3">完了</label>
</p>
<table>
<thead>
<tr>
<th>ID</th>
<th>コメント</th>
<th>状態</th>
</tr>
</thead>
<tr>
<td></td>
<!-- <td>0</td>
<td>test</td>
<td><button>作業中</button></td>
<td><button>完了中</button></td>
<td><button>削除</button></td> -->
</tr>
<tbody id="list"></tbody>
</table>
<h2>新規タスクの追加</h2>
<input type="text" id="newtask"/>
<button id="add">追加</button>
<script src="main.js"></script>
</body>
</html>
'use strict';
{
//inputタグを取得して変数に入れる
const newtask = document.getElementById('newtask');
// 入力された値をリストに追加する
const add = document.getElementById('add');
//削除ボタンを押したときに何かの処理を実行したい
const deleteTask = (btn) => {
const task = btn.closest('tr');
const tbody=task.closest('tbody');
//remove関数を呼び出してタスク(テーブルの一行の要素)を削除します
task.remove();
tbody.querySelectorAll('tr').forEach((x,y)=>{
x.setAttribute('id',`id-${y+1}`);
x.querySelector('td').textContent=y+1;
});
id--;
}
//idの変数を用意
let id = 0;
add.addEventListener('click',() => {
if(newtask.value =='') {
return
}
id += 1;
const list = document.getElementById('list')
const tr = document.createElement('tr')
const taskId = `task-${id}`
tr.id = taskId
const comment = newtask.value;
// 分かりやすい変数名をつけます
const workButton = document.createElement('button');
workButton.innerHTML = '作業中';
//作業中の状態でボタンをクリックすると完了へ変更される
//完了の状態でボタンをクリックすると作業中へ変更される
workButton.addEventListener('click', () => {
if (workButton.innerHTML === '作業中') {
workButton.innerHTML = '完了';
} else {
workButton.innerHTML = '作業中';
}
});
const deleteButton = document.createElement('button');
deleteButton.innerHTML = '削除';
deleteButton.addEventListener('click', () => deleteTask(deleteButton));
// テーブルの行に必要なデータの配列を作成します
const cloumns = [id, comment, workButton, deleteButton]
// 配列の中身を一つずつ取り出して処理をします
cloumns.forEach((cloumn) => {
// テーブルの列を作成します
const td = document.createElement('td');
// HTMLタグ処理を変更
if (cloumn instanceof HTMLElement) {
td.appendChild(cloumn)
} else {
td.innerText = cloumn;
}
//行に列を追加します
tr.appendChild(td);
})
//テーブルに行を追加
list.appendChild(tr);
newtask.value = ''
})
// チェックボックスの表示の切替
let all = document.getElementById('r1');
let working = document.getElementById('r2');
let done = document.getElementById('r3');
// 作業中
working.addEventListener('click', () => {
if (workButton.innerHTML !== '作業中') {
task.classList.add('none')
} else {
task.classList.remove('none')
}
});
// 完了
done.addEventListener('click', () => {
if (workButton.innerHTML !== '作業中') {
task.classList.add('none')
} else {
task.classList.remove('none')
}
});
// 全て
all.addEventListener('click', () => {
task.classList.remove('none');
});
document.getElementById('newtask').value = '';
}