Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle d'écoute d'événement

Sujet résolu
14 octobre 2020 à 14:49:16

Bonjour, je cherche à écouter les évents de tous les articles d'une liste pour si clic affiché les commentaires liés a l'article, mais j'arrive à écouter que le dernier élément.

initRestaurantsJSON(function() {
                const nodeList = document.getElementsByClassName('article');
                console.log(nodeList);
                var i = nodeList.length-1;
                for(x=0x<i ; x++){
                    nodeList[i].addEventListener('click'function(event) {
                        console.log('click sur article : ' + i);
                        document.getElementsByClassName('article-'+i);
                        event.preventDefault();
                    })  
                }
            });

Merci d'avance de votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 16:56:29

Salut, ton i ne bouge pas dans ta fonction vu que tu utilises la variable x:

Tu aurais du mettre:

 nodeList[x].addEventListener('click', function(event) 



  • Partager sur Facebook
  • Partager sur Twitter

La meilleure solution est toujours la plus simple. Ma chaîne Youtube [Tutos pour débutants]

14 octobre 2020 à 17:05:52

A voir ton code, j'ai l'impression que tu mélanges les variables "i" et "x". Manifestement, "i" semble représenter la taille de la NodeList et "x" te permet d'itérer dessus. Mais à l'intérieur de la fonction du "addEventListener", tu cherches à utiliser "i" pour afficher l'élément cliqué 🤔

Après ça, ton problème est un grand classique de JS : la fonction du "addEventListener" utilise la variable globale "x" déclarée dans la boucle for().

Cela veut dire par exemple que si le 3e élément de ta NodeList est cliqué, la fonction va bel et bien se déclencher, mais elle va utiliser en interne la valeur de "x" qui a déjà été modifiée par la boucle for() lors de l'exécution du programme. C'est pour ça que cela ne fonctionne que sur le dernier élément : cela correspond à la valeur finale de "x" après que la boucle for() soit terminée.

La façon la plus simple de régler ce problème est de faire une "closure" pour chaque tour de boucle, et en JS moderne, c'est très simple : utilise un "let" :

initRestaurantsJSON(function() {
    const nodeList = document.getElementsByClassName('article');
    console.log(nodeList);
    var i = nodeList.length - 1;
    for (let x = 0; x < i; x++) {
        nodeList[x].addEventListener('click', function(event) {
            console.log('click sur article : ' + x);
            document.getElementsByClassName('article-' + x);
            event.preventDefault();
        })
    }
});



-
Edité par ninjavascript 14 octobre 2020 à 17:06:37

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 17:54:14

Grand merci pour vos réponses et explication cela fonctionne bien mieux pour le coup !
  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 17:58:36

Avec plaisir. N'hésite pas à marquer le sujet comme "✔ Résolu" 😉
  • Partager sur Facebook
  • Partager sur Twitter