カタバミさんのプログラミングノート

日曜プログラマーがプログラミング関係のメモを記録するブログです。

JavaScriptのevent.targetとevent.currentTargetの違い

event.targetとevent.currentTargetの値は一般的に異なります。例えば以下のサンプルコードを実行すると次の表が得られます。ボタン2と3はどちらもA要素の子要素です。

クリックした場所 event.target event.currentTarget
ボタン1 ボタン1 ボタン1
ボタン2 ボタン2 A要素
ボタン3 ボタン3 A要素
A要素 A要素 A要素
クリックした場所 実際に押された要素 onclickイベントを持つ要素

通常(event.targetなどを使用しない)であればどちらを使用しても問題は起きませんが、クリックされた要素のカスタム属性を使用するためにgetAttribute関数を使う場合などはバグの原因となるので注意が必要です。

サンプルコード
(※Vue.jsで詰まったのでVue.jsを使っていますが、onclickに記述しても同様です)

<html lang="ja">
    <head>
        <meta charset="utf-8">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <title></title>
    </head>
    <body style="padding:.5rem">
        <div id="app1">
            <button @click="click">ボタン1</button>
            <a @click="click" style="border:1px solid black; padding:.5rem;">
                <button>ボタン2</button>
                <button>ボタン3</button>
            </a>
        </div>
        <script>
            var app1 = new Vue({
                el: "#app1",
                methods: {
                    click: function(event) {
                       let s = "";
                       s += "target:"+event.target.constructor.name+" "+event.target.innerText;
                       s += ", ";
                       s += "currentTarget:"+event.currentTarget.constructor.name+" "+event.currentTarget.innerText;
                       console.log(s);
                    }
                }
            });
        </script>
    </body>
</html>

参考 developer.mozilla.org developer.mozilla.org