ToDoアプリをJavascriptだけで作った2つ目のパターンです。今回は配列に入力した情報をいれて、それを画面で見せるようにするというやり方。
挙動
このコードでは、activeのみを表示させた時にステータスを変更したときは、activeのみ表示のままステータスを変更可能。activeのみ表示のときに追加すると、ALLに移動してしまいます。削除した場合はactiveのみの表示から移動せず、そのまま削除される仕様。
コード
ToDo2 - JSFiddle - Code Playground
JSFiddle - Test your JavaScript, CSS, HTML or CoffeeScript online with JSFiddle.
コードは以下のようなかんじ
html
<div class="container">
<div class="row justify-content-center">
<div class="col-md-9">
<h1>ToDo</h1>
<div class="todo-app">
<input id="todo-title2" class="todo-input2" type="text" name="" value="">
<button id="button2" type="button" name="button">追加</button>
<ul id="todo-list">
</ul>
<div>
<input type="radio" id="all2" name="todo" value="all" checked>
<label for="all">all</label>
</div>
<div>
<input type="radio" id="active2" name="todo" value="active">
<label for="active">active</label>
</div>
<div>
<input type="radio" id="completed2" name="todo" value="completed">
<label for="completed">completed</label>
</div>
</div>
</div>
</div>
</div>
css
ul {
list-style: none;
}
.template-none {
display: none;
}
.completed {
text-decoration: line-through;
}
.none {
display: none;
}
javascript
console.log('aaaa');
var todos = [
// {title: 'やること1', status: 'active', display: 'on' },
// {title: 'やること2', status: 'completed', display: 'none' },
// {title: 'やること3', status: 'active', display: 'none' },
// {title: 'やること4', status: 'active', display: 'on' }
];
var completed = []
var active = []
var index = function(todos) {
// console.log('index');
var todoList = '';
for (var i = 0; i < todos.length; i++) {
todoList += '<li class="' + todos[i]['display'] + '"><input class="comp2" type="checkbox" name="" value=""><span class="' + todos[i]['status'] + '">' + todos[i]['title'] + '</span><button class="delete2" type="button" name="button">削除</button></li>'; // = ではなく += を使う
}
document.getElementById('todo-list').innerHTML = todoList;
// ToDoを削除する
var btnEl = document.querySelectorAll('.delete2');
for (var i = 0; i < btnEl.length; i++) {
(function(j) {
btnEl[j].addEventListener('click', function() {
// console.log(j);
// delete todos[j];
todos.splice(j, 1);
console.log(todos);
index(todos);
});
})(i);
}
// ToDoのstatusを切り替える
var checkEl = document.querySelectorAll('.comp2');
for (var k = 0; k < checkEl.length; k++) {
(function(l) {
checkEl[l].addEventListener('change', function() {
// console.log(l);
if (todos[l]['status'] == 'active') {
todos[l]['status'] = 'completed';
} else {
todos[l]['status'] = 'active';
}
index(todos);
});
})(k);
}
// index(todos);
}
//ToDoのタイトル
var title = document.getElementById('todo-title2');
//ToDoを追加する
document.getElementById("button2").addEventListener('click', function() {
//タイトル未記入時はアラート
if (!title.value) {
alert("ToDoが未記入です");
return;
}
todos.push({
title: title.value,
status: 'active'
});
// すべてdisplayをonに
for (var i = 0; i < todos.length; i++) {
if (todos[i].display == "none") {
todos[i].display = "on";
console.log(i);
}
}
index(todos);
//ラジオボタンをAllに
var element = document.getElementById("all2");
// 選択状態にする
element.checked = true;
// titleの値を空に
title.value = '';
});
//ToDoの表示All
document.getElementById("all2").addEventListener('change', function() {
for (var i = 0; i < todos.length; i++) {
if (todos[i].display == "none") {
todos[i].display = "on";
console.log(i);
}
}
// console.log(todos);
index(todos);
});
//ToDoのactiveのみ表示
document.getElementById("active2").addEventListener('change', function() {
for (var i = 0; i < todos.length; i++) {
if (todos[i].status == "active") {
todos[i].display = "on";
// console.log(i);
}
if (todos[i].status == "completed") {
todos[i].display = "none";
// console.log(i);
}
}
// console.log(todos);
index(todos);
});
//ToDoのcompletedのみ表示
document.getElementById("completed2").addEventListener('change', function() {
for (var i = 0; i < todos.length; i++) {
if (todos[i].status == "completed") {
todos[i].display = "on";
// console.log(i);
}
if (todos[i].status == "active") {
todos[i].display = "none";
// console.log(i);
}
}
console.log(todos);
index(todos);
});
index(todos);

コメント