Je ne pense pas que pouvez supprimer un écouteur d'événement pour une fonction anonyme. Utilisez les fonctions nommées à la place:
var myEventListener = function() {
console.log("Hello World!");
};
myElement.addEventListener("click", myEventListener, false);
myElement.removeEventListener("click", myEventListener, false);
Voici une version légèrement modifiée de votre classe qui doit gérer les auditeurs d'événement correctement:
function FirstObj(secondObj){
var self = this;
this.loginButton = document.getElementById("login");
this.logoutButton = document.getElementById("logout");
this.secondObj = secondObj;
this.loginButtonClicked = function(){
self.secondObj.makeSomething();
};
this.logoutButtonClicked = function(){
self.logout();
};
}
FirstObj.prototype = {
manageListeners : function(state){
if (state) {
display += "none";
this.loginButton.addEventListener("click", this.loginButtonClicked, false);
this.logoutButton.removeEventListener("click", this.logoutButtonClicked, false);
}
else {
this.logoutButton.addEventListener("click", this.logoutButtonClicked, false);
this.loginButton.removeEventListener("click", this.loginButtonClicked, false);
}
},
logout : function(){
// Log out...
}
};
Si vous réécrivez votre classe pour tirer parti des fermetures, cependant, vous peut simplifier à ceci:
function FirstObj(secondObj){
var self = this;
var loginButton = document.getElementById("login");
var logoutButton = document.getElementById("logout");
var loginButtonClicked = function(){
secondObj.makeSomething();
};
var logoutButtonClicked = function(){
self.logout();
};
this.manageListeners = function(state){
if (state) {
display += "none";
loginButton.addEventListener("click", loginButtonClicked, false);
logoutButton.removeEventListener("click", logoutButtonClicked, false);
}
else {
logoutButton.addEventListener("click", logoutButtonClicked, false);
loginButton.removeEventListener("click", loginButtonClicked, false);
}
};
this.logout = function(){
// Log out...
};
}
ici, je suis supposé que loginButton
, logoutButton
et secondObj
ne doivent pas nécessairement être accès sed de l'extérieur de la classe. S'ils le font, il suffit de les rendre propriétés de FirstObj
et de mettre à jour le code qui les référence (en utilisant this
dans la portée et self
hors champ).
oui je sais cela, mais si je leur donne un nom, alors j'ai le problème de "cet" objet, et les fonctions anonymes deviennent inutiles –
@Kucebe - Cela peut être, mais vous ne pouvez toujours pas supprimer un anonyme l'écouteur, à moins que vous ne sépariez indistinctement tous les gestionnaires de l'événement. Nommé, quelle que soit la forme, est votre meilleur pari. –
@Kucebe: Je crois que vous avez le problème 'this' si la fonction est anonyme ou non. Je déclare toujours simplement une variable '_this' dans la bonne portée et l'utilise pour faire référence à' this' quand je suis dans une fonction. –