addEventListenerで渡した無名関数の中でremoveEventListenerする
最近は、onload属性やonclick属性に無名関数を渡すやり方ではなく、なるべくaddEventListenerを使うようにしている。
<script type="text/javascript"> window.addEventListener('load', function(){ document.getElementById('button1').addEventListener('click', function(){ alert('hello, world!'); }, false); }, false); </script> <button type="button" id="button1">hello</button>
こんな感じ。
そして、一度セットした関数を削除したいことがある。addEventListenerでセットした関数を削除するには、removeEventListenerを使う。
名前を付けた関数を作っていれば、これは簡単に書ける。
<script type="text/javascript"> window.addEventListener('load', function(){ document.getElementById('button1').addEventListener('click', hoge, false); // ここでadd }, false); function hoge(){ alert('hello, world!'); document.getElementById('button1').removeEventListener('click', hoge, false); // ここでremove } </script> <button type="button" id="button1">hello</button>
addのときもremoveのときも、hogeという関数を渡せば良い。
しかし、冒頭の例のように無名関数を使っていると、関数に名前が無いからこれが書けない。
<script type="text/javascript"> window.addEventListener('load', function(){ document.getElementById('button1').addEventListener('click', function(){ alert('hello, world!'); document.getElementById('button1').removeEventListener('click', /* ここが書けない */, false); }, false); }, false); </script> <button type="button" id="button1">hello</button>
で、調べてみたら、以下の話を見つけた。
なるほど、arguments.calleeを使えるのか。
・・・といっても上記のURLではActionScriptの話をしてる。まあJavaScriptでも同じだろうと思ってさっそくやってみた。
<script type="text/javascript"> window.addEventListener('load', function(){ document.getElementById('button1').addEventListener('click', function(){ alert('hello, world!'); document.getElementById('button1').removeEventListener('click', arguments.callee, false); }, false); }, false); </script> <button type="button" id="button1">hello</button>
うん、バッチリだった。Firefox2では。