我正在尝试删除侦听器定义中的事件侦听器:
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
// remove this event listener here!
}
// More code here ...
我怎么能这样做?这=事件...... 谢谢。
答案 0 :(得分:104)
您需要使用命名函数。
此外,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 ));
编辑: 我忘了命名最后两个版本中返回的处理程序。固定的。
答案 1 :(得分:72)
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
this.removeEventListener('click',arguments.callee,false);
}
应该这样做。
答案 2 :(得分:35)
您可以使用命名函数表达式(在本例中,函数名为a
),如下所示:
var click = 0;
canvas.addEventListener('click', function a(event) {
click++;
if (click >= 50) {
// remove event listener `a`
canvas.removeEventListener('click', a);
}
// More code here ...
}
快速而肮脏的工作示例:http://jsfiddle.net/WqpfZ/1/。
有关命名函数表达式的更多信息:http://kangax.github.io/nfe/。
答案 3 :(得分: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;
};
};
答案 4 :(得分:4)
如果@ Cybernate的解决方案不起作用,请尝试将触发器关闭到它自己的功能,以便您可以引用它。
clickHandler = function(event){
if (click++ == 49)
canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
答案 5 :(得分: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给出的答案很好地工作:)
答案 6 :(得分:1)
我认为您可能需要提前定义处理函数,如下所示:
var myHandler = function(event) {
click++;
if(click == 50) {
this.removeEventListener('click', myHandler);
}
}
canvas.addEventListener('click', myHandler);
这将允许您从名称中删除处理程序。
答案 7 :(得分:-2)
试试这个,它对我有用。
<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>