動的に後から追加された兄弟関係を持つ要素の中から、クリックされた対象の要素の親要素を取得する方法を考えていましたが煮詰まってしまいました。。。
タグの追加機能を実装しようと、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
以上です。
ご指摘アドバイス等ありましたら遠慮なく仰ってください。
よろしくお願いいたします。