63
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

addEventListenerで関数に引数を渡す

Last updated at Posted at 2017-02-07

addEventListenerでイベントをバインドする時にハマった事があるので書いておきます。

ハマった内容

とりあえずコードを見て下さい。

var btn = document.querySelector('.jscBtn');
// clickFunction に引数を渡したい
btn.addEventListener('click', clickFunction, false);

function clickFunction(value){
    console.log(value):
}

clickFunction関数でvalueを使うため、addEventListener時に引数として渡そうとしていますが、上手くいっていないパターンです。

大体うまくいってる例

以下のようにしたら、うまく行きそうな気がしますね。

var btn = document.querySelector('.jscBtn');
btn.addEventListener('click', function(){
    // clickFunction に引数を渡す
    clickFunction('my name'):
}, false);

function clickFunction(value){
    console.log(value): // 'my name'
}

関数に変数を渡すところまでは上手くいっていますが、別の問題が出てきます。以下のコードを見てください。

var btn = document.querySelector('.jscBtn');
btn.addEventListener('click', function(){
    clickFunction('my name'):
}, false);

function clickFunction(value){
    console.log(value): // 'my name'
}

// クリックイベントを解除したいが、うまくいかない
btn.removeEventListener('click', clickFunction , false);

イベントをバインドする事は出来るものの、解除(アンバインド)する事が出来ません。

成功例

var btn = document.querySelector('.jscBtn');
btn.addEventListener('click', clickFunction, false);
btn.eventParam = 'my name';

function clickFunction(event){
    console.log(event.target.eventParam): // 'my name'
}

イベントをバインドしたDOMオブジェクトのパラメータに引数を入れておいて、イベント発火時に参照する形です。
コメントで頂いたアドバイスを元に修正を加えてみました。removeEventListenerでイベントを解除出来るようにもしています。

index.html
<button class="jscBtn" data-name='testName'>Click</button>
<button class="jscRemoveEventBtn">removeEvent</button>
index.js
const btn = document.querySelector('.jscBtn');
const removeEventBtn = document.querySelector('.jscRemoveEventBtn');

const myEvent = function(event){
	console.log(event.target.dataset.name);
}

btn.addEventListener('click', myEvent, false);
removeEventBtn.addEventListener('click', function(){
	btn.removeEventListener('click', myEvent);
}, false);

デモ

気になる点

windowオブジェクトにイベントをバインドする時も、windowオブジェクトに関数の引数を入れる方法で実装は出来るものの、完全にアンチパターンなので他の方法を模索しています。

「俺はこうやってるぞ」等、より良い方法があれば教えて頂けたら嬉しいです。

63
65
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?