IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Boucle "for" qui ne fonctionne pas


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2024
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Boucle "for" qui ne fonctionne pas
    Bonjour à tous, mon problème est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    choixTheme1Li[0].addEventListener("click", () =>
                {themeQuest.textContent=choixTheme1Li[0].textContent}
            )
    choixTheme1Li[1].addEventListener("click", () =>
                {themeQuest.textContent=choixTheme1Li[1].textContent}
            )
    Etc.. jusqu'à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choixTheme1Li[5].addEventListener("click", () =>
                {themeQuest.textContent=choixTheme1Li[5].textContent}
            )
    Ca marche, pas de soucis, mais c'est évidemment pas ce que je voulais faire, qui était ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (j=0;j<6;j++){
        choixTheme1Li[j].addEventListener("click", () =>
                {themeQuest.textContent=choixTheme1Li[j].textContent}
            )
    }
    Et cette factorisation de code ne marche pas, il me renvoie en console :
    Uncaught TypeError: Cannot read properties of undefined (reading 'textContent')
    at HTMLLIElement.<anonymous> (script7.js:53:54)
    Je ne comprend pas où est l'erreur ???
    Merci si vous voyez quelque chose qui doit être évident mais parfois on ne voit plus rien après mille tentatives

  2. #2
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 788
    Points
    788
    Par défaut
    la variable j est capturée par la fonction de rappel attachée à l'évènement.

    Celle ci est définit à j=5 à la fin de la boucle.

    Lorsque la fonction est appelée, la variable vaut 5.

    Préférer Array.forEach
    https://developer.mozilla.org/fr/doc.../Array/forEach

    Tel que,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choixTheme1Li.forEach(e => {
         e.addEventListener("click", () => { themeQuest.textContent=e.textContent; });
    });

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2024
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Rhoooo, elle était énorme celle-là !
    Tout va bien dans le meilleur des mondes.

    Merci bien.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 659
    Points
    66 659
    Billets dans le blog
    1
    Par défaut
    Il est parfois nécessaire d'attacher un index à l'élément dans la boucle.
    On peut alors passer par l'attribut data ou une propriété custom ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (j=0;j<6;j++){
     
        choixTheme1Li[j].data('indexe')= j;
    //ouchoixTheme1Li[j].myIndex=j;
     
    }
    sur le onclick de l'element on aura alors accès au data ou à la propriété
    ou
    Mais c'est clairement une surcharge gourmande dont il vaut mieux se passer lorsqu'on le peut.
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 788
    Points
    788
    Par défaut
    Bonjour,

    attention tout de même,
    vous ne réglez pas le problème lié à l'utilisation d'une fonction fléchée (arrow func)
    du code initial du PO.

    On peut tester le code suivant pour se convaincre de la différence du comportement
    quand à l'attribution de la valeur this en fonction du type de déclaration utilisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*[...document.querySelectorAll("body")].forEach(e => {
         e.addEventListener("click", () => { console.log(this===e); });
    });*/
     
    [...document.querySelectorAll("body")].forEach(e => {
         e.addEventListener("click", function() { console.log(this===e); });
    });
    https://developer.mozilla.org/fr/doc...rrow_functions

    Une expression de fonction fléchée (arrow function en anglais) ... ne possède pas ses propres valeurs pour this, arguments, super, ou new.target.
    C'est une subtilité du langage importante à comprendre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle For Each qui ne fonctionne pas
    Par ory14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/08/2019, 08h19
  2. Boucle do loop while qui ne fonctionne pas
    Par nahamed dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/04/2015, 11h52
  3. pageref qui me fonctionne pas quand il est passé en exposant
    Par pingouin84k dans le forum Mise en forme
    Réponses: 2
    Dernier message: 04/10/2012, 06h21
  4. un For Each qui ne fonctionne pas avec une collection maison !
    Par grenouillesiverte dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/09/2007, 21h00
  5. Fonction Quoted printable qui ne fonctionne pas.
    Par leCcsympas dans le forum C
    Réponses: 3
    Dernier message: 13/01/2007, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo