removeEventListener でリスナーを外すには、登録時と同じ ( A ) と ( B ) を渡す必要がある。無名関数を使うと同一性が保てず解除できない。
解答
A: 関数参照(同一のlistener)
B: オプション(capture 等が同一)
解説
addEventListener(type, listener, options) と removeEventListener(type, listener, options) の listener と options.capture などは同一でなければならない。別インスタンスの関数では一致しない。
使用例(サンプルコード)
[ html ]
<button id="b">切替</button>
<script>
function onClick(){ console.log("click"); }
b.addEventListener("click", onClick, { capture:false });
setTimeout(() => {
b.removeEventListener("click", onClick, { capture:false });
}, 2000);
</script>