即使我正在使用removeEventListener,也要注册多个事件侦听器

pla*_*web 2 javascript events removechild

这让我疯了.我正在注册多个mouseout事件,即使我正在使用removeEventListener()删除它们.我尝试了各种各样的变化.基本上,一旦mouseout事件发生,我想摆脱它,因为用户将翻阅不同的图像以查看大预览.它工作正常,但注册的多个事件让我感到震惊.

this.removeEventListener('mouseout', handler, false);
Run Code Online (Sandbox Code Playgroud)

没别的了.我不确定我在这里做什么.我似乎无法摆脱mouseout事件,他们只是继续打桩.

document.querySelector('.grid').addEventListener('mouseover',function(e) {
  if (e.target.tagName==='IMG') {
    var myElement=document.createElement('div');
      myElement.className='preview';
      e.target.parentNode.appendChild(myElement);

    var handler = e.target.addEventListener('mouseout', function (d) {
      var myNode = d.target.parentNode.querySelector('div.preview');
      console.log(d.target.parentNode);
      if (myNode) {
        myNode.parentNode.removeChild(myNode);
      }
      this.removeEventListener('mouseout', handler, false);
    });
  } //
}, false); // addEventListener
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 6

addEventListener没有返回值,所以handlerundefined和调用removeEventListener将失败.

改为使用命名函数表达式:

// give the function a name                    vvvvvvv
e.target.addEventListener('mouseout', function handler(d) {
  // ...
  this.removeEventListener('mouseout', handler, false); // use name
}, false); // <- don't forget `false` here, just in case
Run Code Online (Sandbox Code Playgroud)

函数的名称只能在函数本身内访问.