L'ajout et la Suppression d'Écouteurs d'Événement avec des paramètres
Je suis en train d'écrire un vanille JavaScript outil, que lorsqu'elle est activée ajoute des écouteurs d'événements pour chacun des éléments passés dans celui-ci.
Je voudrais faire quelque chose comme ceci:
var do_something = function (obj) {
//do something
};
for (var i = 0; i < arr.length; i++) {
arr[i].el.addEventListener('click', do_something(arr[i]));
}
Malheureusement cela ne fonctionne pas, parce que pour ce que je sais, lors de l'ajout d'un écouteur d'événement, les paramètres ne peuvent être passés dans les fonctions anonymes:
for (var i = 0; i < arr.length; i++) {
arr[i].el.addEventListener('click', function (arr[i]) {
//do something
});
}
Le problème est que j'ai besoin d'être en mesure de retirer l'écouteur d'événement lorsque l'outil est désactivé, mais je ne pense pas qu'il est possible de retirer les écouteurs d'événement avec des fonctions anonymes.
for (var i = 0; i < arr.length; i++) {
arr[i].el.removeEventListener('click', do_something);
}
Je sais que je pourrais facilement utiliser jQuery pour résoudre mon problème, mais je suis en train d'essayer de minimiser les dépendances. jQuery doit obtenir autour de cette en quelque sorte, mais le code est un peu la jungle!
removeEventListener
.Puisque vous savez jQuery peut résoudre votre problème, vous avez juste besoin de lire le code source de la façon dont il fonctionne.
+1 au moins pour les caractères gras les mots " à la vanille JavaScript, et aussi italicising votre point de vue à propos de jQuery! (J'espère que personne ne sera effectivement suggérer jQuery comme une solution maintenant...) Mais aussi +1 parce que c'est une bonne question.
OriginalL'auteur tomturton | 2013-02-26
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas valide:
L'auditeur doit être une fonction référence. Vous ne pouvez pas spécifier des paramètres au moment de l'auditeur d'affectation. Une fonction de gestionnaire sera toujours appelée avec le
event
être passé comme premier argument. Pour passer d'autres arguments, vous pouvez envelopper votre auditeur dans une fonction anonyme comme suit:Pour être en mesure de supprimer via
removeEventListener
vous juste le nom de la fonction de gestionnaire:D'avoir accès à d'autres variables dans la fonction de gestionnaire, vous pouvez utiliser des fermetures. E. g.:
En faisant de l'auditeur en fonction d'une variable globale ou un dans un contexte que vous pouvez accéder à partir de là où vous en avez besoin, cela peut être résolu. E. g.
window.listeners.myListener = function() { ... }
. De cette façon, vous pouvez à tout moment direelem.removeEventListener('click', window.listeners.myListener)
J'ai résolu le problème en appliquant les fonctions d'écouteur pour arr[i].J'ai ensuite été en mesure de se référer à l'ensemble de l'arr[i] de l'objet sans avoir besoin de passer des paramètres à l'auditeur.
OriginalL'auteur marekful
Vous pouvez utiliser
Que l'événement est passé à la
do_something
fonction comme premier paramètre, vous pouvez obtenir l'élément de l'événement commepour supprimer auditeur
si vous souhaitez passer un autre obj comme paramètre le faire
oui en question que vous avez posté le même dans la deuxième extrait de code pour la fonction anonyme
arr[i].el.addEventListener('click', function (arr[i])
... alors que voulez-vous faire passer comme argument réellement?L'Argument doit être
arr[i]
par opposition àarr[i].el
laquelle l'auditeur est attaché.donc, si u veux
arr[i]
être transmis à laquelle l'auditeur est attaché. leevent
qui est par défaut le passé à la fonction contient laarr[i]
OriginalL'auteur Sandeep
Cela peut se faire assez facilement, il suffit de pas que vous avez maintenant.
Au lieu d'essayer d'ajouter et de supprimer aléatoire anonymouse fonctions, vous avez besoin d'ajouter ou de supprimer une fonction qui gère l'exécution de votre autres fonctions.
C'est juste une version réduite de ce que j'ai écrit avant, mais vous pouvez obtenir l'essentiel de ce que j'espère.
OriginalL'auteur whitneyit