ラボ > Javascript関連:イベント関連
javascriptでイベントの追加、削除、引数ありなど(addEventListener, removeEventListener)
ネイティブのjavascriptでイベント関連のメモ
作成日:2024-01-23, 更新日:2024-02-22
基本
「セットしたイベントは削除可能」ってのを前提にする
→「addEventListener()」に関数を直書きするコトを避ける
イベントの追加
基本型: 対象が一つのとき
▼クリック時
function hadl_xxxx() {
console.log('xxx');
}
let dom = document.querySelector('xxxx');
dom.addEventListener('click', hadl_xxxx);
基本型: 対象が複数あるとき
▼クリック時
function hadl_xxxx() {
console.log('xxx');
}
let dom_many = document.querySelectorAll('xxxx');
dom_many.forEach(function(element) {
element.addEventListener('click', hadl_xxxx);
});
引数アリ
▼クリック時
function hadl_xxxx(e) {
console.log('xxx');
}
let _hadl_xxxx = (e) => hadl_xxxx(e); // いったん変数にアロー関数を格納
let dom = document.querySelector('xxxx');
dom.addEventListener('click', _hadl_xxxx);
クラス内とかでthisを使えるようにしておきたい
▼クリック時
function hadl_xxxx() {
console.log(this.xxx);
}
let dom = document.querySelector('xxxx');
dom.addEventListener('click', hadl_xxxx.bind(this));
イベントの削除
dom.addEventListener('click', hadl_xxxx); // ←コイツを削除したい
dom.removeEventListener('click', hadl_xxxx);
イベントの追加時のメモ
任意のタイミングでイベントを追加し、その後、任意のタイミングで削除したい…ってコトがある
- イベント追加時に諸々保存しておく
- 必要なイベントを削除
▼サンプル。必要に応じて改修
let event_store = []; // 各イベントの設定の格納先
function addEventHandler(selector, eventType, handler) {
const target = document.querySelector(selector);
if (target && target.parentNode) {
let tmp = ({
selector: selector,
eventType: eventType,
handler: handler,
});
event_store.push(tmp);
target.addEventListener(eventType, handler);
}
}
function removeEventHandler(one_event) {
const target = document.querySelector(one_event.selector);
if (target && target.parentNode) {
target.removeEventListener(one_event.eventType, one_event.handler);
}
}
function removeEventHandler_all() {
for (let idx in event_store) {
this.removeEventHandler(event_store[idx]);
}
event_store = [];
}
// 各イベント発火時に実行したいメソッドたち
function hadl_xxx(){}
function hadl_xxy(){}
function hadl_xyy(){}
// イベント発火時に実行したい関数をいったん配列に格納
let seed_trg_handler = {};
seed_trg_handler['abc'] = hadl_xxx;
seed_trg_handler['def'] = hadl_xxy;
seed_trg_handler['ghi'] = hadl_xyy;
// イベントの設定
addEventHandler('.xxx', 'click', seed_trg_handler[abc]);
addEventHandler('.xxy', 'click', seed_trg_handler[def]);
addEventHandler('.xyy', 'click', seed_trg_handler[ghi]);
// 指定したセレクター、イベント、関数の組み合わせを削除
let remove_one_event = ({
selector: '.xxy',
eventType: 'click',
handler: seed_trg_handler[def],
});
removeEventHandler(remove_one_event);
// イベントをマルっと削除
removeEventHandler_all();
各イベントの設定をevent_storeに格納するときに添え字を指定しておけば、削除するときもラクになる…はず