J'utilise un tel code pour transmettre des arguments aux fonctions du gestionnaire d'événements. Mais, dans ce cas particulier, la boucle cause des problèmes. Seul le dernier linkTags [i] est accessible dans tous les appels actifsVisual. Cela a à voir avec le fait que la fonction anonyme qui passe l'argument est une seule et même chose pour toute la boucle.Puis-je transmettre une nouvelle fonction anonyme à addEventListener?
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Maintenant, je me souviens avoir essayé d'ajouter de nouvelles avant la déclaration de fonction anonyme comme ceci:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Il ne fonctionne pas. L'ActiveVisual n'est jamais appelé. Quelqu'un peut-il m'expliquer pourquoi et comment puis-je le faire fonctionner, s'il vous plaît?
MISE À JOUR SOLUTION FINALE
Merci à toutes les réponses ci-dessous mon code TRAVAIL ressemble maintenant à ceci:
// Function that provides pass of event handling parameters with separate copy in each loop
function callbackHandler(index) {
return function(evt) {
activeVisual(evt, linkTags[index]);
}
}
...
for (var i = 0; i < linkTags.length; i++) {
...
addCrossEvent(linkTags[i], "mousedown", callbackHandler(i));
}
Si l'itérateur i variable est le problème comment se fait-il ne provoque pas de problèmes dans cette ligne addCrossEvent (linkTags [i], "cliquez sur", launchLink); ? Est-il seulement passé par la référence aux fonctions anonymes? –
parce que lorsque vous ajoutez addCrossEvent (linkTags [i], "click", launchLink); vous avez la valeur i dans le tableau linkTags pour chaque boucle, mais quand la fonction est appelée sur l'événement, j'ai la dernière valeur, et vous avez seulement la même position dans le tableau – madeinstefano
@ avok00: Dans 'addCrossEvent (linkTags [i ], "click", launchLink) 'vous passez la valeur de' linkTags [i] 'directement à la fonction.Mais 'activeVisual (evt, linkTags [i]);' dans le * callback * est évalué lorsque le callback est appelé, * not * dans la boucle. Mais quand le callback est appelé, la boucle est déjà terminée et 'i' a sa valeur finale. –