JavaScript
addEventListener
0
どのような問題がありますか?

投稿日

javascriptで動的に生成した子要素でイベントを発火してほしい

たまにどうしても使いたくなるけど簡単に調べられないので備忘録的に。
pure javascript でのイベントの割り当てについて書きます。

動的に子要素を生成

配列データを回しながら動的に子要素を生成します。

HTML側がこうなっていて。

<div id="list-target"></div>

動的な生成が以下のようになります。
DOM生成のコストを下げるために文字列で組み立てたものをinnerHTMLで流し込んでいます。

let parentEelement = document.getElementById("list-target");
let childHtmlSource = "";
info.list.forEach((item, index, arrays) => {
  childHtmlSource += "<dl data-uid=\"" + item.uid + "\">"
                   + "<dd>" + item.uid + "</dd>"
                   + "<dd>" + item.name + "</dd>"
                   + "</dl>";
});
parentEelement.innerHTML = childHtmlSource;

この状況で各ddタグにクリックイベントを割り当てたい時のaddEventListnerの付け方です。

イベントの割り当て

方法自体は単純でoptionをtrueにした上で、Event.Targetを判定します。
キャプチャーフェーズとかイベントバブリングとかの説明は省略します。

document.getElementById("list-target").addEventListener((e) => {
  let targetElement = e.target;
  if (/(DD)/.test(targetElement.tagName)) {
    console.log("[%s]", this.parentNode.dataset.uid);
  }
}, true);

なぜこのような方法を採るのかですが、子要素生成後に以下のように書くと幾つかデメリットがあります。
「子要素の数だけaddEventListener()を呼び出すコスト」と「要素の追加・削除した際にイベントの張り直しが必要」というデメリットがあるため上記の方法を採っています。

document.querySelectorAll("#list-target dl").forEach((item, index, arrays) => {
  item.addEventListener("click", (e) => {
    console.log("[%s]", e.currentTarget.dataset.uid);
  }, false);
});
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ikisa

コメント

if (/(DD)/.test(targetElement.tagName)) {

上記、

if (targetElement.tagName === 'DD') {

とせず、testメソッドでわざわざ正規表現を使って判別しているのはどのような理由でしょう。

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
データに関する記事を書こう!
~
新人プログラマ応援 - みんなで新人を育てよう!
~
0
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー