2010-12-09 63 views
85

J'essaie de supprimer un écouteur d'événement à l'intérieur d'une définition de l'auditeur:JavaScript: Supprimer l'événement auditeur

canvas.addEventListener('click', function(event) { 
    click++; 
    if(click == 50) { 
     // remove this event listener here! 
    } 
// More code here ... 

Comment pourrais-je faire cela? this = event ... Merci.

+6

trivial mais pour les futures références 'if (cliquez sur == 50) {' 'doit être si (cliquez sur === 50)' 'ou si (cliquez sur> = 50)' - ils ne changeront pas la sortie, mais pour des raisons de santé mentale, ces contrôles ont plus de sens. – rlemon

+0

Bonne question ... comment puis-je le supprimer si je n'ai pas accès au contenu? Je veux supprimer les popups pour les boutons onclick sur l'utilisation de greasemonkey pour d'autres sites, mais à moins que je puisse référencer la fonction par son nom, je ne trouve pas de moyen de l'enlever. – JasonXA

Répondre

-3

Essayez cette

canvas.addEventListener('click', function(event) { 
    click++; 
    if(click == 50) { 
      canvas.removeEventListener('click'); 
    } 
+8

C'est jQuery ... – Ender

+2

@Ender: Vous avez raison ... Je travaille beaucoup avec jQuery ces jours-ci .. Je ne l'ai pas réalisé :) – Chandu

+0

Ça nous arrive à tous (je pense) :) – Ender

4

Si @ solution de Cybernate ne fonctionne pas, essayez de casser la gâchette hors pour sa propre fonction de sorte que vous pouvez référencer.

clickHandler = function(event){ 
    if (click++ == 49) 
    canvas.removeEventListener('click',clickHandler); 
} 
canvas.addEventListener('click',clickHandler); 
+0

Désolé Brad. Accidentellement modifié votre réponse. Annulées. – user113716

+0

lol, j'ai regardé et était comme "wtf?". Pas de problème, était une amélioration du code, déclarant explicitement le clic. ;-) –

84

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 pouvez 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 à travers plusieurs éléments.


Si vous ne voulez pas, et que vous voulez chacun d'avoir son propre compteur, faites ceci:

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 étant retourné dans les deux dernières versions. Fixé.

+7

+1 - J'ai fait cela en un violon et ça n'a pas marché. Mais c'était parce que j'avais besoin de cliquer cinquante fois :) Quel idiot je suis. Exemple simplifié ici: http://jsfiddle.net/karim79/aZNqA/ – karim79

+1

@ karim79: J'aimerais pouvoir dire que je n'ai jamais rien fait de tel auparavant. : o) Merci pour le jsFiddle. – user113716

+0

+1 La troisième option a fonctionné pour moi. Affectation d'un événement clé à un champ de saisie pour effacer la validation. Nice merci – Gurnard

1

Je pense que vous devrez peut-être définir la fonction de gestionnaire à l'avance, comme ceci:

var myHandler = function(event) { 
    click++; 
    if(click == 50) { 
     this.removeEventListener('click', myHandler); 
    } 
} 
canvas.addEventListener('click', myHandler); 

Cela vous permettra de supprimer le gestionnaire par nom en lui-même.

+0

Je crois que c'est eventListener pas gestionnaire. ;-) –

+0

Oui, merci ... me suis confondu avec mon nom var :( – Ender

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

Doit le faire.

+12

C'est cool! Doc sur 'arguments.callee' pour les parties intéressées: https://developer.mozilla.org/fr/JavaScript/Reference/Functions_and_function_scope/arguments/callee – Ender

+45

Notez que cela ne fonctionnera pas en mode strict ECMAScript5 – user123444555621

3
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; 
}; 
}; 
+0

fonctionne parfaitement mais il est très lent, je ne sais pas pourquoi ... – mech

21

Vous pouvez utiliser une expression de fonction nommée (dans ce cas, la fonction est appelée a), comme suit:

var click = 0; 
canvas.addEventListener('click', function a(event) { 
    click++; 
    if (click >= 50) { 
     // remove event listener `a` 
     canvas.removeEventListener('click', a); 
    } 
    // More code here ... 
} 

exemple de travail rapide et sale: http://jsfiddle.net/WqpfZ/1/.

Plus d'informations sur les expressions de fonction nommées: http://kangax.github.io/nfe/.

+0

Grande solution merci. – gkiely

3

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); 
    } 
}); 

espoir que cela peut aider quelqu'un. Notez que la réponse donnée par @ user113716 fonctionne bien :)

-1

Essayez ceci, cela a fonctionné pour moi.

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