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

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

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

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

Q&A

1回答

650閲覧

【javascript】動的に追加された兄弟関係の要素の中から、クリックされた要素の取得方法

JunTakizawa

総合スコア10

JavaScript

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

0グッド

1クリップ

投稿2019/04/26 02:38

編集2019/04/26 05:12
動的に後から追加された兄弟関係を持つ要素の中から、クリックされた対象の要素の親要素を取得する方法を考えていましたが煮詰まってしまいました。。。

タグの追加機能を実装しようと、javascript縛りでコードを書いています。
タグを追加するところまでは実装できたのですが、追加された状態から任意のタグを削除できるようにしようとしているところで、削除したい要素を取得できずにおります。

※以下2019/4/26「やりたい事」追記


◆やりたい事

入力フォームから追加されたタグ内にあるXアイコンをクリックすると、その親要素(タグ全体)を取得し、削除する。


◆試した事

イベントリスナーの対象となる要素をタグの親要素(let display)としています。その上でコンソールへ以下のパターンで取得を試みてみました。

js

1function deleteTag(){ 2 console.log(this); //これで一旦取得を確認 3 console.log(this.firstElementChild); //取得はできるが常に最初の要素を取得してしまうため、任意の要素を削除する事はできない。lastElementChildも同様。 4 console.log(this.children); //これで配列として兄弟要素を管理して、そこからクリックされた要素を検索してremove?? 5 6}; 7 8display.addEventListener('click', deleteTag, false);

以下現状のhtmlファイルの表示部分抜粋とjsファイルです。

  • htmlのコメントアウトしてある部分が実際に動的に追加されていく要素となります。
  • 今回アイコンはfontawesomeを採用しています。

GitHubにも以下と同じ状態のコードを公開しております。
GitHubでコードを見る

html

1 2<section class="main_wrapper"> 3 <h2>タグ</h2> 4 <label><input type="text" data-js="input_tag_form" placeholder="タグを入力:スペース区切りで複数追加できます"></label> 5 <button type="button" data-js="add_tag_button">追加</button> 6</section> 7<section class="display" data-js="display_tags_area"> 8 <!-- <div class="tag_body"> 9 <i class="fas fa-times-circle" data-js="delete_tag"></i> 10 <span>タグネーム</span> 11 </div> --> 12</section> 13

js

1 2let input = document.querySelector('[data-js="input_tag_form"]'); 3let button = document.querySelector('[data-js="add_tag_button"]'); 4let display = document.querySelector('[data-js="display_tags_area"]'); 5let del_icon = document.querySelector('[data-js="delete_tag"]'); 6let tags_arr = []; 7function divideSpace(input){ 8 return input.trim().split(/[\s ]+/); 9}; 10 11//追加ボタンが押下された時の処理 12button.addEventListener('click', function(){ 13 14 15 let divided_tag = divideSpace(input.value); 16 let element = ''; 17 let regex = /^[ \s\r\n\t]*$/; 18 19 20 for( let i=0; i<divided_tag.length; i++ ){ 21 if( divided_tag[i] === divided_tag[i+1] ){continue;} 22 else if( divided_tag[i].match(regex) ){ 23 alert('スペースのみで追加はできません'); 24 continue; 25 }else{ 26 if( tags_arr.indexOf(divided_tag[i]) === -1 ){ 27 element = `<div class="tag_body"> 28 <i class="fas fa-times-circle" data-js="delete_tag"></i> 29 <span>${divided_tag[i]}</span> 30 </div>`; 31 display.innerHTML += element; 32 // input.value = ''; 33 tags_arr.push(divided_tag[i]); 34 // console.log(tags_arr); 35 } else { 36 alert(`${divided_tag[i]}」は既に存在します`); 37 // input.value = ''; 38 }; 39 }; 40 }; 41 input.value = ''; 42}); 43 44function deleteTag(){ 45 console.log(this); //thisから辿って削除したい要素を一旦コンソールに出力しようとしています。 46}; 47 48//タグ内のXが押下されたときの処理 49 display.addEventListener('click', deleteTag, false); 50

以上です。
ご指摘アドバイス等ありましたら遠慮なく仰ってください。
よろしくお願いいたします。

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

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

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

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

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

yambejp

2019/04/26 03:15

結果何を得たいのでしょうか? 仮にaaaと入力して追加した場合aaaをクリックしたら どこを返してほしいのでしょうか?
JunTakizawa

2019/04/26 03:42

ご連絡ありがとうございます!! すいません。やりたい事の情報の記述してませんでした。 実際にはaaaではなく、その前にある<i></i>タグをクリックすると、そのaaaタグの<div class="tag_body"></>要素を返して欲しいです。 <i></i>がクリックされたら、その親要素である<div class="tag_body"></div>要素を削除したいです。 aaaと入力するとaaaのタグができて、そのタグの左にXのアイコンがあって、そこをクリックするとaaaタグが消えるといった感じです。
guest

回答1

0

javascript

1function deleteTag(e){ 2 console.log(e.target); 3}; 4

であればクリックしたHTML要素になります
その親要素ならe.target.parentNode

追記

さかのぼった.tag_bodyまで消したいならこうです

javascript

1function deleteTag(e){ 2 var tag=e.target.closest('.tag_body'); 3 tag.parentNode.removeChild(tag); 4}

.closestはIEでは動作しないので、IE対応のために適当なpollyfillを用意してください

投稿2019/04/26 03:25

編集2019/04/26 03:48
yambejp

総合スコア114808

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問