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

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

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

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

JavaScript

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

Q&A

解決済

2回答

1431閲覧

ボタンクリック時に該当箇所削除

united.reds.30

総合スコア10

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2019/07/24 00:52

編集2019/07/24 04:33

前提・実現したいこと

+ボタンで要素を追加し、cardクラスを出力
カード内にある削除という名のbuttonタグが押されます。その際に追加していたカードが削除されるようにしたいです。

該当のソースコード

HTML

1 2 <div class="tile is-ancestor back"> 3 <div class="tile is-parent board"> 4 <div class="tile is-child"> 5 <div class="drag-area"> 6 <div class="nameboard side"> 7 <div class="button is-primary is-rounded" onclick="add();">+</div> 8 <div class="name"> No nameさん</div> 9 <div class="no_name"> 10 <span style="display: none;"></span> 11 </div> 12 </div> 13 <div class="back" id="Noname_card"> 14 </div> 15 16 17 </div> 18 </div> 19 </div> 20

JS

1var add = () => { 2 3 let add_ele = document.getElementById("Noname_card"); 4 5 const div_element = document.createElement("div"); 6 7 div_element.innerHTML = `<div class="card"> 8 <div class="no_name"> 9 <span style="display: none;"></span> 10 </div> 11 <div class="name"> 12 <p> タスク</p> 13 </div> 14 <div class="button is-primary" onclick="del();">削除</div> 15</div>`; 16 17 add_ele.appendChild(div_element.childNodes[0]); 18 19} 20 21var del = () => { 22 23 let card_dele = document.getElementById("Noname_card"); 24 25 26 27 28 } 29 30}

試したこと

JS

1 2var add = () => { 3 4 let add_ele = document.getElementById("Noname_card"); 5 6 const div_element = document.createElement("div"); 7 8 div_element.innerHTML = `<div class="card"> 9 <div class="no_name"> 10 <span style="display: none;"></span> 11 </div> 12 <div class="name"> 13 <p> タスク</p> 14 </div> 15 <div class="button is-primary" onclick="del();">削除</div> 16</div>`; 17 18 add_ele.appendChild(div_element.childNodes[0]); 19 add_ele.addEventListener("click", del, false); 20 21} 22 23var del = () => { 24 let card_dele = document.getElementById("Noname_card"); 25 card_dele.removeChild(this.addele.childNodes[0]); 26}

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

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

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

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

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

gentaro

2019/07/24 00:55

> if (card_dele.childNodes[i].onclick == card_dele.childNodes[i]) { 絶対にfalseになりますが、このコードの意図は何でしょうか。
united.reds.30

2019/07/24 01:02

出力されないコードをそのままコピペしたため、このコードが残っていました。削除します。
m.ts10806

2019/07/24 01:13

buttonが押されるのではなくカードが押されるのでしょうか。
united.reds.30

2019/07/24 01:17

カード内にある削除という名のbuttonタグが押されます。その際に追加していたカードが削除されるようにしたいです。(日本語下手ですみません...)
m.ts10806

2019/07/24 01:22

その説明で充分理解できますので、質問本文を更新しておいてください。
guest

回答2

0

ベストアンサー

カード内にある削除という名のbuttonタグが押されます。その際に追加していたカードが削除されるようにしたい

要は「動的に追加された要素に対するイベント付与」がキーワードですね。
下記の質問が参考になると思います。

「要素が画面上に追加されてからその要素に対してイベントを付与する」ということになります。

あとは付与したイベントのthisが押したボタン自身となるので
そこから親要素を辿ってcardクラスを見つけ、削除すると良いです。

コード追記を受けて:

もともと「削除ボタン」にonclickがついているので改めてaddEventListenerする必要なかったですね。失礼しました。
呼び出しているところと関数定義のところ、引数を追加してください。

js

1<div class="button is-primary" onclick="del(this);">削除</div>

js

1var del = (btn) => {

これで「そのボタン自身」が渡ります。

あとは「そのボタンが所属するcard」を見つけるだけですが、
これは結構色んなやり方があると思います。

先に書いた「parentNode」でも良いですし、「Noname_cardのn番目のcard」でも良いと思います。
buttonクラスがこの削除ボタンにしか付与されないなら「Noname_card内でn番目のbuttonクラス」を求めることは可能なはずですので。

別案:

cardに連番でもidをつけてonclickでそのidを渡し、それをもってcardを削除
(たぶんこれが一番簡単・・)

投稿2019/07/24 01:26

編集2019/07/24 04:38
m.ts10806

総合スコア80850

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

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

united.reds.30

2019/07/24 02:11

説明ありがとうございます。要素が画面上に追加されてからその要素に対してイベントに対してthisを使用するのですか?そこのとこをもう少し詳しくお伺いしたいです。
m.ts10806

2019/07/24 02:14

>要素が画面上に追加されてからその要素に対してイベントに対してthisを使用するのですか? ちょっと認識が違うと思います。 追加した要素にイベントを付与するわけですから、そのイベントで呼び出されるthisは必ず「イベントが発生した要素」になります。
united.reds.30

2019/07/24 02:26

回答ありがとうございます。 追加したものに、イベントを付与させる。そのイベントをthisで呼び出すと、おのずと削除ボタンを押されたカードが削除されるという順番なんですね。
m.ts10806

2019/07/24 02:31

そのイベントのthis=押した削除ボタン です。そこからは「その削除ボタンが所属するcard」を辿る必要があります(どうやって辿るかはリンクつけてます)
united.reds.30

2019/07/24 02:37 編集

回答ありがとうございます。リンクを見たのですが、まだわかりません。面倒だとは思いますが、コードを書いて説明してくださるとありがたいです<(_ _)>
m.ts10806

2019/07/24 02:52

まず書いてみてください。ここで他人が書いたコードで他人の説明を受けたところで「わかりません」から脱することはできないと思います。 それに回答に提示した質問に流用可能なコードはあります。
m.ts10806

2019/07/24 02:54

面倒だからコードを回答につけないわけではなく、質問に提示されたコードから「提示した内容をヒントに解決すると思っているから」書かない です。 自身が提示されたコードをきちんと理解できていれば、ヒントをもとに組み込むことは十分可能と思ってます。
united.reds.30

2019/07/24 04:26 編集

ありがとうございます。今、自分のコードとリンクから書いてみました。 削除ボタンを押すとdel関数は反応するのですがthisの指定が分からず上手くいかないです。
m.ts10806

2019/07/24 04:17

これも「試したこと」ですし、コメント欄ではマークダウン使えませんので 「回答を受けてやってみたこと」としてコードを”追記”願います
m.ts10806

2019/07/24 04:23

あれ?というかよく見たらボタンにonclickつけてますね。addEventListenerの必要ないですね。
m.ts10806

2019/07/24 04:23

add_eleはそもそもカード自体なので「ボタンに」でしたらもっと簡単です。
united.reds.30

2019/07/24 04:29

thisをなにと付けるのかがわからないです。
m.ts10806

2019/07/24 04:31

onclickがあることで少し方向性変わりました。(見落としてましたすみません) あと細かくて申し訳ないですが、最初のコードと同じくコードはマークダウンでお願いします。
united.reds.30

2019/07/24 04:32

いえいえ。回答ありがとうございます。マークダウン修正します。
guest

0

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 document.querySelector('#add').addEventListener('click',add) 4 document.querySelector('#Noname_card').addEventListener('click',e=>{ 5 var t=e.target; 6 if(t.classList.contains("del")) del(t); 7 }); 8}); 9const add =()=>{ 10 const e1 = document.querySelector('#Noname_card'); 11 const e2 = document.createElement('body'); 12 e2.innerHTML = `<div class="card"> 13 <div class="no_name"> 14 <span style="display: none;"></span> 15 </div> 16 <div class="name"> 17 <p> タスク</p> 18 </div> 19 <div class="button is-primary del">削除</div> 20</div>`; 21 e1.appendChild(e2.querySelector('div')); 22} 23const del =ele=>{ 24 var e=ele.closest('.card'); 25 e.parentNode.removeChild(e); 26} 27</script> 28 29<div class="tile is-ancestor back"> 30<div class="tile is-parent board"> 31<div class="tile is-child"> 32<div class="drag-area"> 33<div class="nameboard side"> 34<div class="button is-primary is-rounded" id="add"></div> 35<div class="name"> No nameさん</div> 36<div class="no_name"> 37<span style="display: none;"></span> 38</div> 39</div> 40<div class="back" id="Noname_card" class="test"> 41</div> 42</div> 43</div> 44</div>

投稿2019/07/24 02:27

yambejp

総合スコア114825

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問