
トップデベロッパーになるために作成したいアプリ8選 - Qiita
こちらの記事は、Indrek Lasn 氏により2017年 12月に公開された『 The Secret to Being a Top Developer Is Building Things! H…
上のページに有る8つのアプリのうち、ToDoアプリをJavascriptだけでまずは作ってみました。3通り作りましたが、こちらはhtmlのtemplateタグを利用した方法となっています。
挙動について
ToDoアプリを作った際に気になったのが、activeのみを表示させた時にステータスを変更したときの動き、activeのみを表示させた時の削除の挙動と追加の挙動です。
こちらでは、activeのみを表示させた時にステータスを変更したときは、activeのみ表示のままステータスを変更可能。activeのみ表示のときに追加、削除してもactiveのみの表示から移動せず、そのまま削除される仕様。なんだかんだこれが一番自然かなあと思っています。
コード
ToDoApp - JSFiddle - Code Playground
JSFiddle - Test your JavaScript, CSS, HTML or CoffeeScript online with JSFiddle.
上のリンクはjsfiddleで動くToDoアプリです。ソースコードは以下のようになっています。
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-title" class="todo-input" type="text" name="" value=""> <input id="button" type="button" name="button" value="追加"> <ul id="todo-list"> </ul> <div> <input type="radio" id="all" name="todo" value="all" checked> <label for="all">all</label> </div> <div> <input type="radio" id="active" name="todo" value="active"> <label for="active">active</label> </div> <div> <input type="radio" id="completed" name="todo" value="completed"> <label for="completed">completed</label> </div> <template id="productrow"> <li> <input type="checkbox" name="" value=""> <span class="active"></span> <button id="todo-delete" type="button" name="button">削除</button> </li> </template> </div> </div> </div> </div>
css
ul { list-style: none; } .completed { text-decoration: line-through; } .none { display: none; }
Javascript
var template = document.querySelector('#productrow'); // console.log(template); // console.log('aaa'); //ToDoのタイトル var title = document.getElementById('todo-title'); // console.log(title); //ToDoすべて表示 document.getElementById("all").addEventListener('change', function() { var all_completed = document.getElementsByClassName("completed"); var all_active = document.getElementsByClassName("active"); // console.log(completed); [].forEach.call(all_completed, function(elem) { elem.parentNode.classList.remove('none'); }); [].forEach.call(all_active, function(elem) { elem.parentNode.classList.remove('none'); }); console.log("all"); }); //ToDoのactiveのみ表示 document.getElementById("active").addEventListener('change', function() { var completed = document.getElementsByClassName("completed"); var active = document.getElementsByClassName("active"); // console.log(active); [].forEach.call(completed, function(elem) { elem.parentNode.classList.add('none'); }); [].forEach.call(active, function(elem) { elem.parentNode.classList.remove('none'); }); // console.log("active"); }); //ToDoのcompletedのみ表示 document.getElementById("completed").addEventListener('change', function() { var completed = document.getElementsByClassName("completed"); var active = document.getElementsByClassName("active"); console.log(completed); [].forEach.call(completed, function(elem) { elem.parentNode.classList.remove('none'); }); [].forEach.call(active, function(elem) { elem.parentNode.classList.add('none'); }); // console.log("completed"); }); //ToDoを追加 document.getElementById("button").addEventListener('click', function() { console.log('aaaa') //タイトル未記入時はアラート if (!title.value) { alert("ToDoが未記入です"); return; } // templete 要素の content 属性の有無を確認することで、 // ブラウザーが HTML template 要素に対応しているかテストします。 if ('content' in document.createElement('template')) { var todoul = document.querySelector("#todo-list"); var clone = document.importNode(template.content, true); var span = clone.querySelectorAll("span"); span[0].textContent = title.value; // ボタンが押されたらリストから削除 clone.querySelector('button').addEventListener('click', function() { var parent = this.parentNode; parent.parentNode.removeChild(parent); console.log(parent); }); // チェックマークが入ったら取り消し線を切り替え clone.querySelector('input').addEventListener('change', function() { var done = this.nextElementSibling; if (done.className == 'completed') { // done.removeAttribute('class'); done.setAttribute('class', 'active'); } else { done.setAttribute('class', 'completed'); } // console.log(done); }); //ToDoを追加 todoul.appendChild(clone); // titleの値を空に title.value = ''; } else { // HTML template 要素に対応していないので // 表に行を追加するほかの方法を探します。 } });
コメント