removeEventListenerの使い方間違えてた

add時と引数違うとだめなのか。

うわーremoveしたことなかったから知らなかった。removeせずに関数内で判定させてイベントおこさないようにしてた。イベント放置プレーバレバレ。

function a(){
  console.log('バカですよ');
}
document.documentElement.addEventListener('mouseover', a, false);
document.documentElement.removeEventListener('click', a, false);

document.documentElementをクリックしたらイベント無くなるのかなーとかaddと同じ要領で使った。これじゃ削除されない。document.documentElementをクリックすることで、mouseoverのイベントを削除するのだったら、

function a(){
  console.log('バカですよ');
}

document.documentElement.addEventListener('mouseover', a, false);
document.documentElement.addEventListener('click', function() {
  document.documentElement.removeEventListener('mouseover', a, false);
}, false);

こうか。それぞれのイベントでオブジェクト違うから関数の参照だけじゃないよなあ。気づかないとは相変わらず底浅くしょっぱいぜ・・・。

無名関数の場合

検索したらあったけどAS。
http://un-q.net/2007/07/addeventlistener_removeeventlistener.html#comment-6219

document.documentElement.addEventListener('mouseover', function() {
  var arg = arguments.callee;
  console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
  document.documentElement.addEventListener('click', function() {
    document.documentElement.removeEventListener('mouseover', arg, false);
  }, false);
}, false);

このようにイベントで削除したい。少し変えよう。

document.documentElement.addEventListener('mouseover', function() {
  console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
  document.documentElement.addEventListener('click', (function(arg) {
    return function() {
      document.documentElement.removeEventListener('mouseover', arg, false);
    }
  })(arguments.callee), false);
}, false);

というか。離れ技がしたい。離れながらにして無名関数を辻斬りしたい。

document.documentElement.addEventListener('mouseover', function() {
  console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
}, false);

document.documentElement.addEventListener('click', function() {
  document.documentElement.removeEventListener('mouseover', function() {
    console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
  }, false);
}, false);

これでうまくいかないのは分かるが。どうにかならんか。やっぱり無難にどっかぶち込まなきゃいけないな。


んー、

var b = document.documentElement;
b.addEventListener('mouseover', (function() {
  return Function.f = function() {
    console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
  }  
})(), false);

b.addEventListener('click', function() {
  b.removeEventListener('mouseover', Function.f, false);
}, false);

うそですごめんなさいごめんなさい><ミャー


うーん。

var b = document.documentElement;
b.addEventListener('mouseover', (function(fn) {
  b.setUserData('key', fn, null);
  return fn;
})(function() {
    console.log('バカじゃない!ちょっと頭がおかしいだけだ!');
  }), false);

b.addEventListener('click', function() {
  b.removeEventListener('click', arguments.callee, false);
  b.removeEventListener('mouseover', (function(fn) {
    b.setUserData('key', null, null);
    return fn;
  })(b.getUserData('key')), false);
}, false);

http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-setUserData
ううーん。あまりこういうの好きじゃないけど。setUserData便利。削除もsetUserDataっぽいのでなんかあれですが。


ここで気づいたけど今までclickのイベントをまた放置プレーしていた。あーっはっは。


・・・辻斬りとか正直どうでもいいから普通に書いてしまおう。