JavaScript:删除事件侦听器

IT技术 javascript events event-handling listener
2021-02-04 16:53:46

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

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

我怎么能那样做?这 = 事件...

6个回答

您需要使用命名函数。

此外,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 ));

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

@karim79:我希望我能说我以前从未做过这样的事情。:o) 感谢 jsFiddle。
2021-03-10 16:53:46
+1 第三个选项对我有用。将键事件分配给输入字段以清除验证。不错的谢谢
2021-03-13 16:53:46
也会myClick = function(event){...}被视为命名函数吗?
2021-03-18 16:53:46
+1 - 我把它变成了小提琴,但没有用。但那是因为我需要点击 50 次 :) 我真是个白痴。这里的简化示例:jsfiddle.net/karim79/aZNqA
2021-03-21 16:53:46
Upvote,这里的第三个选项是理解 JS 绑定/解除绑定的重要部分
2021-04-01 16:53:46
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

应该做。

这很酷!arguments.callee感兴趣方的文档developer.mozilla.org/en/JavaScript/Reference/...
2021-03-29 16:53:46
不幸的是,这不适用于 ECMAScript 5(2009)或更高版本,来自 MDN 链接:“ECMAScript 第 5 版(ES5)禁止arguments.callee()在严格模式下使用arguments.callee()。通过给函数表达式一个名称或使用函数声明来避免使用函数必须调用自身的地方。” (虽然它正在使用callee()而不是callee,但它仍然被删除,嘘!)
2021-03-29 16:53:46

您可以使用命名函数表达式(在这种情况下,函数名为 named 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/

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

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
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;
};
};