JavaScriptで後から追加した要素にイベントを割り当てる方法と挙動の違いについて
jQueryで後から追加した要素に対してイベントを割り当てる場合、いつもと異なる記述が必要になるがJavaScriptだとどうなるのか知らなかった。試したところonclick / addEventListenerどちらも動作したが微妙に挙動が異なった。その辺りをメモ。
対応方法
ソースコード
いずれの方法でも後から追加した要素に対してイベントの割り当てが可能。ただ、微妙に挙動が異なる。
<div id="test_area"></div>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
document.querySelector(`#test_area`).innerHTML = `<button id="test_btn" onclick="clickFunc();">button</button>`;
function clickFunc(){
console.log(`click 1`);
}
document.querySelector(`#test_btn`).onclick = function() {
console.log(`click 2`);
}
document.querySelector(`#test_btn`).addEventListener(`click`, function() {
console.log(`click 3`);
});
document.querySelector(`#test_btn`).addEventListener(`click`, function() {
console.log(`click 4`);
});
</script>
挙動について
上記ソースコードを実行するとコンソールには「click 2」「click 3」「click 4」が表示される。
どうも1つ目のonclick属性、2つ目のclickプロパティについては上書きされる仕様みたい。そのため「click 1」が「click 2」に上書きされている。
addEventListenerの場合は上書きされず追加されるという挙動のため「click 3」「click 4」が表示される。
明確にイベントを上書きしたいという場合じゃない限りaddEventListenerを使用するのが無難かと思われる。
関連記事
-
-
Chart.jsで横スクロール可能なグラフを表示させる方法
Chart.jsで折れ線グラフを表示するページがあった。過去1年分のデータをグラ ...
-
-
javascriptで月末日を取得
以前、PHPで月末日を取得したけれども javascriptで月末日を扱いたいケ ...
-
-
Leafletのマップ状況をブラウザに保存し、再表示時に復元する「Leaflet.RestoreView」の利用方法
Leafletのマップ状況をブラウザ(cookie等)に保存し、ページリロード時 ...
-
-
sweetalert2を閉じた後、指定位置にスクロールしようとしても元の位置に戻る現象を解決する方法
sweetalert2で表示したウィンドウを閉じた後、指定位置にスクロールさせた ...
-
-
IE&javascriptの予約語
前にもひっかかった問題で、今日同じことで 時間をとられたのでメモ。 予約語? っ ...