web-dev-qa-db-fra.com

JavaScript: supprimer un écouteur d'événement

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.

110
thomas

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.

107
user113716
   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

Devrait le faire.

73
edeverett

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/ .

40
Tama
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;
};
};
7
Vinyl Windows

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 :)

4
youssman

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);
4
Brad Christie

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.

1
Ender