JavaScript: удалить прослушиватель событий
Я пытаюсь удалить прослушиватель событий внутри определения прослушивателя:
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
// remove this event listener here!
}
// More code here ...
Как я мог это сделать? this = event...
Спасибо.
Ответы
Ответ 1
Вам нужно использовать именованные функции.
Кроме того, переменная 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);
EDIT:. Вы можете закрыть переменную 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 ));
EDIT: Я забыл называть обработчик, возвращаемый в двух последних версиях. Фиксированный.
Ответ 2
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
this.removeEventListener('click',arguments.callee,false);
}
Должен это сделать.
Ответ 3
Вы можете использовать выражение с именованной функцией (в этом случае функция называется 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/.
Ответ 4
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;
};
};
Ответ 5
Если решение @Cybernate не работает, попробуйте отключить триггер в своей собственной функции, чтобы вы могли ссылаться на него.
clickHandler = function(event){
if (click++ == 49)
canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
Ответ 6
Если кто-то использует 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, прекрасно работает:)
Ответ 7
Я думаю, вам может понадобиться заранее определить функцию обработчика, например:
var myHandler = function(event) {
click++;
if(click == 50) {
this.removeEventListener('click', myHandler);
}
}
canvas.addEventListener('click', myHandler);
Это позволит вам удалить обработчик по имени из самого себя.
Ответ 8
Попробуй, это сработало для меня.
<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>
Ответ 9
Попробуйте это
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
canvas.removeEventListener('click');
}