JavaScript:删除事件侦听器
我正在尝试删除侦听器定义中的事件侦听器:JavaScript:删除事件侦听器,javascript,events,event-handling,listener,Javascript,Events,Event Handling,Listener,我正在尝试删除侦听器定义中的事件侦听器: canvas.addEventListener('click', function(event) { click++; if(click == 50) { // remove this event listener here! } // More code here ... 我怎么能这么做?此=事件。。。 谢谢。如果@Cybernate的解决方案不起作用,请尝试将触发器断开到它自己的函数中,以便您可以引用它 cl
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
// remove this event listener here!
}
// More code here ...
我怎么能这么做?此=事件。。。
谢谢。如果@Cybernate的解决方案不起作用,请尝试将触发器断开到它自己的函数中,以便您可以引用它
clickHandler = function(event){
if (click++ == 49)
canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
您需要使用命名函数 另外,
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);
编辑:您可以关闭
单击计数器
变量,如下所示:
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 ));
EDIT:我忘记了在上两个版本中返回的处理程序的名称。已修复。我认为您可能需要提前定义处理程序函数,如下所示:
var myHandler = function(event) {
click++;
if(click == 50) {
this.removeEventListener('click', myHandler);
}
}
canvas.addEventListener('click', myHandler);
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 ...
}
这将允许您按名称从自身中删除处理程序
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
this.removeEventListener('click',arguments.callee,false);
}
我应该这样做 element.querySelector('.addDoor').onEvent('click',函数(e){});
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;
};
};
元素.querySelector('.addDoor').RemovelListeners();
HTMLElement.prototype.OneEvent=函数(eventType、回调、useCapture){
addEventListener(事件类型、回调、useCapture);
如果(!this.myListeners){
this.myListeners=[];
};
this.myListeners.push({eType:eventType,callBack:callBack});
归还这个;
};
HTMLElement.prototype.RemovelListeners=函数(){
if(this.myListeners){
for(var i=0;i
您可以使用命名函数表达式(在本例中,函数名为abc
),如下所示:
var myHandler = function(event) {
click++;
if(click == 50) {
this.removeEventListener('click', myHandler);
}
}
canvas.addEventListener('click', myHandler);
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 ...
}
快速而肮脏的工作示例:
有关命名函数表达式的更多信息:。如果有人使用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给出的答案很好:)试试这个,它对我有用
<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>
点击
控制台日志(btn)
让f;
btn.addEventListener('click',f=函数(事件){
console.log('单击')
控制台日志(f)
此.removeEventListener('click',f)
console.log('事件已删除')
})
这太酷了!有关参数的文档。被调用方
对于感兴趣的各方:谢谢,这很有帮助。不幸的是,这不适用于ECMAScript 5(2009)或更高版本,来自MDN链接:“第五版ECMAScript(ES5)禁止在严格模式下使用参数。被调用方()
。避免使用参数。被调用方()
给函数表达式一个名称,或者在函数必须调用自身的地方使用函数声明。”(虽然它使用了callee()
而不是callee
,但它仍然被删除,boo!)+1-我把它做成了一把小提琴,但它不起作用。但那是因为我需要点击50次:)我真是个白痴。这里有一个简单的例子:@karim79:我希望我能说我以前从未做过这样的事情o) 谢谢你的jsFiddle.+1第三个选项对我很有用。将关键事件分配给输入字段以清除验证。很好的一票,这里的第三个选项是理解JS绑定/解除绑定的重要部分myClick=function(event){…}
是否也被视为命名函数?很简单,但对于将来的参考if(click==50){
应该是if(click==50)
或者if(click>=50)
-它们不会更改输出,但出于理智的原因,这些检查更有意义。好问题……如果我无法访问内容,如何删除它?我想在其他网站上使用greasemonkey删除onclick on按钮的弹出窗口,但除非我能按名称引用该函数,否则我似乎找不到删除它的方法。