J'ai un objet qui contient des méthodes. Ces méthodes sont placées dans l'objet à l'intérieur d'une fonction anonyme. Cela ressemble à ceci:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(il y a beaucoup plus de code, mais cela suffit pour montrer le problème)
Maintenant, je veux arrêter l'écouteur d'événements dans certains cas. Par conséquent, j'essaie de faire un removeEventListener mais je ne peux pas comprendre comment faire cela. J'ai lu dans d'autres questions qu'il n'est pas possible d'appeler removeEventListener sur des fonctions anonymes, mais est-ce également le cas dans cette situation?
J'ai créé une méthode dans la fonction anonyme et j'ai donc pensé que c'était possible. Ressemble à ça:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Pourquoi je ne peux pas faire ça?
Y a-t-il une autre (bonne) façon de faire cela?
Info bonus; cela ne doit fonctionner que dans Safari, d'où le support IE manquant.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
, puis faites Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... et de même pour removeEventListener. J'espère que vous pouvez voir cela bien.Réponses:
Je crois que c'est le but d'une fonction anonyme, il lui manque un nom ou un moyen de la référencer.
Si j'étais vous, je créerais simplement une fonction nommée, ou je la mettrais dans une variable pour que vous y fassiez référence.
Vous pouvez ensuite le supprimer en
la source
this
mot clé peut prêter à confusion. Un bon endroit pour en savoir plus est quirksmode.org/js/this.htmlthis
fait référence à l'élément auquel l'écouteur est ajouté, pas à l'événement lui-même (qui serait le paramètree
). Par conséquentthis === e.currentTarget
. lire developer.mozilla.org/en-US/docs/Web/API/EventTarget/…si vous êtes dans la fonction réelle, vous pouvez utiliser arguments.callee comme référence à la fonction. un péché:
EDIT: Cela ne fonctionnera pas si vous travaillez en mode strict (
"use strict";
)la source
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Une version de la solution d' Otto Nascarella qui fonctionne en mode strict est:
la source
Peut être plusieurs fonctions anonymes, keydown 1
Attention: ne fonctionne que dans
Chrome Dev Tools
& ne peut pas être utilisé dans code : linkla source
getEventListeners
semble faire partie des outils de développement Chrome, il n'est donc pas vraiment utilisable pour autre chose que le débogage.dans les navigateurs modernes, vous pouvez effectuer les opérations suivantes ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
la source
Une option pas si anonyme
Depuis que j'ai reçu des commentaires d'Andy ( tout à fait raison, mais comme pour de nombreux exemples, je souhaitais montrer une expansion contextuelle de l'idée ), voici une exposition moins compliquée :
Cela permet une structure de fonction effectivement anonyme, évite l'utilisation de l' appelé pratiquement obsolète et permet une suppression facile.
Incidemment : la suppression de l'élément de script immédiatement après avoir défini l'auditeur est une astuce mignonne pour cacher du code que l'on préférerait ne pas être tout à fait évident pour les regards indiscrets ( cela gâcherait la surprise ;-)
Donc la méthode ( plus simplement ) est:
la source
Ce n'est pas idéal car cela supprime tout, mais pourrait fonctionner pour vos besoins:
Node.cloneNode ()
la source
JavaScript : la méthode addEventListener enregistre l'écouteur spécifié sur l'objet EventTarget (élément | document | fenêtre) sur lequel il est appelé.
EventTarget. addEventListener ( event_type , handler_function, Bubbling | Capture );
Evénements souris, clavier Exemple de test dans WebConsole:
removeEventListener supprime l'écouteur d'événements précédemment enregistré avec EventTarget.addEventListener ().
puis-je utiliser
la source
Pour donner une approche plus à jour à cela:
la source
Je suis tombé sur le même problème et c'était la meilleure solution que je pouvais obtenir:
Gardez à l'esprit que je n'ai testé cela que pour l'
window
élément et pour l''mousemove'
événement, donc il pourrait y avoir des problèmes avec cette approche.la source
Peut-être pas la meilleure solution en termes de ce que vous demandez. Je n'ai toujours pas déterminé de méthode efficace pour supprimer la fonction anonyme déclarée en ligne avec l'invocation de l'écouteur d'événements.
J'utilise personnellement une variable pour stocker
<target>
et déclarer la fonction en dehors de l'appel de l'écouteur d'événements, par exemple:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Ensuite, pour supprimer l'auditeur:
target.removeEventListener('click', myFunc);
Ce n'est pas la principale recommandation que vous recevrez, mais pour supprimer les fonctions anonymes, la seule solution que j'ai trouvée utile est de supprimer puis de remplacer l'élément HTML. Je suis sûr qu'il doit y avoir une meilleure méthode JS vanille mais je ne l'ai pas encore vue.
la source
Je sais que c'est un fil assez ancien, mais j'ai pensé que je pourrais mettre mes deux cents pour ceux qui le trouvent utile.
Le script (excuses pour les noms de méthodes non créatives):
Et vous pouvez l'utiliser comme ceci:
la source
la source
addEventListener
.