###前提・実現したいこと
現在、jQueryで書かれたコードをネイティブのJSに変換をしています。
その中でonイベントを使ってデリゲート処理を行っている箇所があり、
ネイティブのJSでどのように書いて再現すればよいのかわからず質問させていただきました。
実現したいことは下記です。
- 下記の
#wrap
を起点にイベントを監視(.item
は動的に増える可能性があるため) #wrap
の子要素をクリックすると、その.item
を起点にして任意の子要素の情報を取得。
(item1テキストをクリックしたら、spanタグのid(この場合id1)、aタグのhref属性値(この場合1.html)を取得。
- 取得した情報をajaxで送信(これは別件なので本質問の対象外です)
jqueryで書かれているのは下記です。
$("#wrap").on('click','.item',function(event) { event.preventDefault(); event.stopPropagation(); // idを取得 var id = $(this).find(".child").attr("id"); // hrefを取得 var href = $(this).find("a").attr("href"); console.log(id, href); });
###発生している問題
#wrap
をクリックするとイベントターゲットがa要素まで行ってしまい、.itemを起点にすることできません。
どうやればシンプルに実装できるでしょうか。
###該当のソースコード
html
1<div id="wrap"> 2 <div class="item"> 3 <span class="child" id="id1"><a href="1.html">item1</a></span> 4 </div> 5 <div class="item"> 6 <span class="child" id="id2"><a href="2.html">item2</a></span> 7 </div> 8 <div class="item"> 9 <span class="child" id="id3"> <a href="3.html">item3</a></span> 10 </div> 11 <div class="item"> 12 <span class="child" id="id4"><a href="4.html">item4</a></span> 13 </div> 14 <div class="item"> 15 <span class="child" id="id5"><a href="5.html">item5</a></span> 16 </div> 17</div> 18 19<button id="btn">add</button>
javascript
1const wrap = document.getElementById('wrap'); 2 3wrap.addEventListener('click', function(e) { 4 e.preventDefault(); 5 console.log(e.target); // -> <a href="1.html">item1</a> 6 /* 7 ここをなんとかしたい 8 */ 9}, false); 10 11 12// addボタンのイベント登録 13const btn = document.getElementById('btn'); 14let num = 6; 15btn.addEventListener('click', function() { 16 const item = document.createElement('div'); 17 item.innerHTML = `<span class="child" id="id${num}"><a href="${num}.html">item${num}</a></span>`; 18 item.classList.add('item'); 19 num++; 20 wrap.appendChild(item); 21});
お力添えいただけると幸いです。何卒よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/07 07:41