これが一般的な質問である場合は申し訳ありませんが、検索で適切であると思われる回答を見つけることができませんでした。
このようなイベントリスナーをアタッチすると:
_window.addEventListener('scroll', function() { check_pos(box); }, false);
_
次のように、後で削除しようとしても機能しないようです。
_window.removeEventListener('scroll', function() { check_pos(box); }, false);
_
これは、addEventListener
メソッドとremoveEventListener
メソッドが同じ関数への参照を必要としているのに対し、コードでは同一であるが文字通り同じではない匿名関数を提供しているためだと思います。
コードを変更してremoveEventListener
の呼び出しを機能させるにはどうすればよいですか? 「ボックス」引数は、画面で追跡している_<iframe>
_の名前を指します。つまり、私が持っている_<iframe>
_ごとにscroll
イベントを1回サブスクライブできるようにしたいと思います(数量は異なります)。そして、check_pos()
関数が特定の別の関数を呼び出し、イベントリスナーを削除してシステムリソースを解放します。
私の直感は、ソリューションにはクロージャや匿名関数の名前付け、あるいはその両方が含まれるということですが、それがどのように見えるのか正確にはわかりません。具体的な例をいただければ幸いです。
それが理にかなっていると思います。
(あなたが提案したように)無名関数への参照を維持しようとしましたか?
そう:
var listener = function() {
check_pos(box);
};
window.addEventListener('scroll', listener, false);
...
window.removeEventListener('scroll', listener, false);
Mozillaのドキュメント suggest 同じことです。
var listener;
listener = function(){
if( window.target != anotherEvent.target )
{
...CODE where
window.removeEventListener('click', listener , false);
};
window.addEventListener('click', listener ,false);
_document.getElementById("yourId").removeEventListener("click",yourfunction1);
document.getElementById("yourId").addEventListener("click",yourfunction2);
function yourfunction1(){
//write code here
alert(1);
}
function yourfunction2(){
//write code here
alert(2);
}
_
<button type="button" onclick="yourfunction1()" id="yourId">Button</button>