J'essaie de supprimer un écouteur d'événement à l'intérieur d'une définition d'écouteur:
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
// remove this event listener here!
}
// More code here ...
Comment pourrais-je faire ça? cet = événement ... Merci.
Vous devez utiliser des fonctions nommées.
De plus, la variable click
doit être en dehors du gestionnaire pour être incrémentée.
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: Vous pourriez fermer autour de la variable click_counter
comme ceci:
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);
De cette façon, vous pouvez incrémenter le compteur sur plusieurs éléments.
Si vous ne le souhaitez pas et que chaque joueur a son propre compteur, procédez comme suit:
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: J'avais oublié de nommer le gestionnaire renvoyé dans les deux dernières versions. Fixe.
canvas.addEventListener('click', function(event) {
click++;
if(click == 50) {
this.removeEventListener('click',arguments.callee,false);
}
Devrait le faire.
Vous pouvez utiliser une expression de fonction nommée (dans ce cas, la fonction est nommée abc
), comme suit:
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 ...
}
Exemple de travail rapide et incorrect: http://jsfiddle.net/8qvdmLz5/2/ .
Plus d'informations sur les expressions de fonction nommées: http://kangax.github.io/nfe/ .
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;
};
};
Si quelqu'un utilise jQuery, il peut le faire comme ceci:
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 );
}
});
J'espère que ça peut aider quelqu'un. Notez que la réponse donnée par @ user113716 fonctionne bien :)
Si la solution de @ Cybernate ne fonctionne pas, essayez de casser le déclencheur dans sa propre fonction pour pouvoir le référencer.
clickHandler = function(event){
if (click++ == 49)
canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);
Je pense que vous devrez peut-être définir la fonction de gestionnaire à l’avance, comme suit:
var myHandler = function(event) {
click++;
if(click == 50) {
this.removeEventListener('click', myHandler);
}
}
canvas.addEventListener('click', myHandler);
Cela vous permettra de supprimer le gestionnaire par son nom.