Maison > interface Web > js tutoriel > Pourquoi les écouteurs d'événements dans les boucles JavaScript ciblent-ils toujours le dernier élément ?

Pourquoi les écouteurs d'événements dans les boucles JavaScript ciblent-ils toujours le dernier élément ?

Patricia Arquette
Libérer: 2024-11-10 04:25:02
original
951 Les gens l'ont consulté

Why do Event Listeners in JavaScript Loops Always Target the Last Element?

Comprendre le comportement des écouteurs d'événements dans les boucles

En JavaScript, les écouteurs d'événements permettent aux éléments de répondre aux actions de l'utilisateur. L'utilisation de boucles pour ajouter des écouteurs d'événements à plusieurs objets peut soulever des inquiétudes quant à la fonctionnalité des écouteurs.

Le problème avec l'approche traditionnelle

Considérez la situation suivante : vous essayez d'ajouter cliquez sur les écouteurs d'événements sur plusieurs éléments dans une classe "conteneur". Cependant, lorsque vous utilisez une boucle for traditionnelle, vous remarquez que tous les auditeurs finissent par cibler le dernier élément de la boucle.

La raison : fermetures

Ce comportement se produit en raison de fermetures en JavaScript. Lorsque vous affectez des variables dans la boucle, elles font référence au même emplacement mémoire. Ainsi, lorsque vous tentez d'accéder à ces variables dans les fonctions d'écoute d'événements, elles font toujours référence aux valeurs de la dernière itération.

La solution : invocation immédiate

Pour résoudre ce problème problème, utilisez l’invocation immédiate dans la boucle. Ce faisant, vous créez un nouveau contexte d'exécution pour chaque itération, garantissant que les variables de ce contexte restent locales et indépendantes des variables de boucle.

Code fixe :

Le code corrigé ci-dessous utilise l'invocation immédiate pour obtenir le comportement souhaité :

// Autoloading function to add the listeners:
var elem = document.getElementsByClassName("triggerClass");

for (var i = 0; i < elem.length; i += 2) {
    (function () {
        var k = i + 1;
        var boxa = elem[i].parentNode.id;
        var boxb = elem[k].parentNode.id;
        elem[i].addEventListener("click", function() { makeItHappen(boxa,boxb); }, false);
        elem[k].addEventListener("click", function() { makeItHappen(boxb,boxa); }, false);
    }()); // immediate invocation
}
Copier après la connexion

Dans ce code corrigé, l'invocation immédiate crée un nouveau contexte d'exécution pour chaque itération, permettant aux variables boxa et boxb de se maintenir leurs valeurs appropriées dans les fonctions d'écoute d'événement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal