質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

658閲覧

javascript todoリスト 削除機能

koko122102

総合スコア39

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/01/25 15:30

質問失礼いたします。質問内容はjsでのtodoリスト作成における削除機能の部分のエラーの解決方法と原因についてです。
自分が実装した内容は、削除ボタンを押す→押した削除ボタンの列が消える。といったものです。1個だけtodoを登録して削除するのは問題ないのですが、2つ以上todoを登録したときに、一応削除はできるのですがエラーが出てくるといった状況で、調べても解決手段はなかったです。
このエラー原因と解決方法についてご教授いただければ幸いです。初歩的な質問で大変恐縮ではございますが、よろしくお願いいたします。

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <link rel="stylesheet" href="css/style.css"> 8 <title>Document</title> 9</head> 10<body> 11 12 13 <div id="container"> 14 <div class="content"> 15 <table class="table"> 16 <tr> 17 <th>日付</th> 18 <th>やること</th> 19 <th>優先度</th> 20 <th>削除</th> 21 </tr> 22 </table> 23 24 <div class="tipe-space"> 25 <input type="text" id="input"> 26 <button id="btn">登録</button> 27 </div> 28 </div> 29 </div> 30 31 <script src="js/main.js"></script> 32</body> 33</html>

javascript

1let input = document.querySelector("#input"); 2let btn = document.querySelector("#btn"); 3let table = document.querySelector(".table"); 4let del = "削除"; 5let arry = []; 6const time = new Date(); 7 8 9document.addEventListener("DOMContentLoaded", function(){ 10 btn.addEventListener("click", addToDo); 11}); 12 13function addToDo(){ 14 let inputValue = input.value; 15 let obj = {}; 16 obj.time = time.toLocaleString(); 17 obj.content = inputValue; 18 obj.priority = 3; 19 arry.push(obj); 20 insetHtml(obj); 21} 22 23function insetHtml(obj){ 24 let insertContent = ""; 25 insertContent = `<tr><td>${obj.time}</td><td>${obj.content}</td><td>${obj.priority}</td><td><button class="delBtn">${del}</button></td></tr>` 26 table.insertAdjacentHTML("beforeend", insertContent); 27 input.value = ""; 28 let delBtn = document.querySelectorAll(".delBtn"); 29 delBtn.forEach(btns =>{ 30 btns.addEventListener("click", (e) => delTodo(e)); 31 }); 32 console.log(arry); 33} 34 35function delTodo(e){ 36 table.removeChild(e.target.closest("tbody")); 37}

javascript

1Uncaught DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

列が既に1つある状態で insetHtml() が呼ばれると、

  1. 列を1つ追加する
  2. class=delBtn を持つ要素すべてclickイベントリスナを追加する

ということで、既にあった列のボタンには同じ内容のイベントリスナが2つ付きます。

改善策1:
insetHtml()では最後のボタンにだけイベントリスナを追加しましょう。

js

1 delBtn[delBtn.length - 1].addEventListener("click", delTodo);

改善策2:
動的にイベントリスナを設定するのはやめて、documentにイベントリスナを足しましょう。

js

1document.addEventListener('click', e => { 2 if (e.closest(".delBtn")) { 3 delTodo(e); 4 } 5}); 6// insetHtml() 内の querySelectorAll()の行以降は削除

あと、delTodo() の中で消すのは tbody ではなく tr では。

投稿2022/01/25 15:47

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問