JavaScript:删除事件侦听器


136

我正在尝试在侦听器定义中删除事件侦听器:

canvas.addEventListener('click', function(event) {
    click++;
    if(click == 50) {
        // remove this event listener here!
    }
// More code here ...

我该怎么办?这=事件...谢谢。


8
微不足道,但对于未来的参考if(click == 50) {应该是if( click === 50 )if( click >= 50 )-他们不会改变输出,但理智原因,这些检查更有意义。
rlemon 2012年

很好的问题...如果我无权访问内容,如何将其删除?我想删除使用其他网站上的oilsmonkey的onclick在按钮上的弹出窗口,但是除非我可以按名称引用该函数,否则我似乎没有找到删除它的方法。
JasonXA 2015年

Answers:


121

您需要使用命名函数。

同样,click变量需要在处理程序外部才能递增。

var click_count = 0;

function myClick(event) {
    click_count++;
    if(click_count == 50) {
       // to remove
       canvas.removeEventListener('click', myClick);
    }
}

// to add
canvas.addEventListener('click', myClick);

编辑:您可以click_counter像这样关闭变量:

var myClick = (function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
})( 0 );

// to add
canvas.addEventListener('click', myClick);

这样,您可以跨多个元素递增计数器。


如果您不希望这样,并且希望每个人都有自己的计数器,请执行以下操作:

var myClick = function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
};

// to add
canvas.addEventListener('click', myClick( 0 ));

编辑: 我忘记了命名在最后两个版本中返回的处理程序。固定。


14
+1-我把它弄成小提琴,但没有用。但这是因为我需要单击五十次:)我真是个白痴。此处的简化示例:jsfiddle.net/karim79/aZNqA
karim79 2010年

4
@ karim79:我希望我可以说我从未做过类似的事情。:o)感谢jsFiddle。
user113716 2010年

+1第三种选择对我有用。将键事件分配给输入字段以清除验证。好的,谢谢你
Gurnard

赞成,这里的第三种选择是理解JS绑定/解除绑定的重要部分
SW4

也将myClick = function(event){...}被视为命名函数吗?
DanielMöller'15

80
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

应该做。


14
这很酷!文件对arguments.callee有关各方:developer.mozilla.org/en/JavaScript/Reference/...
安德

谢谢,这很有帮助。
John O

2
不幸的是,这不适用于MDN链接中的ECMAScript 5(2009)或更高版本:“ ECMAScript(ES5)的第五版禁止arguments.callee()在严格模式下使用。请避免arguments.callee()通过给函数表达式命名或使用函数声明来使用函数必须自行调用的位置。” (尽管它正在使用callee()代替callee,但仍被删除,嘘!)

59

您可以使用命名函数表达式(在这种情况下,函数名为abc),如下所示:

let click = 0;
canvas.addEventListener('click', function abc(event) {
    click++;
    if (click >= 50) {
        // remove event listener function `abc`
        canvas.removeEventListener('click', abc);
    }
    // More code here ...
}

快速而肮脏的工作示例:http : //jsfiddle.net/8qvdmLz5/2/

有关命名函数表达式的更多信息:http : //kangax.github.io/nfe/


聪明。NFE有用的罕见情况之一。谢谢。
DanMan

7
element.querySelector('.addDoor').onEvent('click', function (e) { });
element.querySelector('.addDoor').removeListeners();


HTMLElement.prototype.onEvent = function (eventType, callBack, useCapture) {
this.addEventListener(eventType, callBack, useCapture);
if (!this.myListeners) {
    this.myListeners = [];
};
this.myListeners.push({ eType: eventType, callBack: callBack });
return this;
};


HTMLElement.prototype.removeListeners = function () {
if (this.myListeners) {
    for (var i = 0; i < this.myListeners.length; i++) {
        this.removeEventListener(this.myListeners[i].eType, this.myListeners[i].callBack);
    };
   delete this.myListeners;
};
};

6

如果@Cyber​​nate的解决方案不起作用,请尝试将触发器拆分为它自己的函数,以便您可以引用它。

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);

4

如果有人使用jquery,他可以这样做:

var click_count = 0;
$( "canvas" ).bind( "click", function( event ) {
    //do whatever you want
    click_count++;
    if ( click_count == 50 ) {
        //remove the event
        $( this ).unbind( event );
    }
});

希望它可以帮助某人。请注意,@ user113716给出的答案很好用:)


2

我认为您可能需要提前定义处理程序函数,如下所示:

var myHandler = function(event) {
    click++; 
    if(click == 50) { 
        this.removeEventListener('click', myHandler);
    } 
}
canvas.addEventListener('click', myHandler);

这将允许您从其内部按名称删除处理程序。


-4

试试这个,对我有用。

<button id="btn">Click</button>
<script>
 console.log(btn)
 let f;
 btn.addEventListener('click', f=function(event) {
 console.log('Click')
 console.log(f)
 this.removeEventListener('click',f)
 console.log('Event removed')
})  
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.