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 :

Questions/réponses, boutons et boucle


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Questions/réponses, boutons et boucle
    Bonjour à tous,

    je poste mon premier message sur ce forum après plusieurs jours d'impasse...

    Je pense qu'il ne manque pas grand chose, mais je ne trouve pas la solution malgré toutes mes recherches (je suis en train de me former sur javaScript alors...soyez indulgents )
    Voila, j'ai un tableau avec des questions et des réponses.
    J'ai créé une boucle pour les afficher, et en cliquant sur le bouton réponse, celui-ci doit laisser place à la réponse écrite.
    Or, seul le dernier bouton "réponse" fait ce qu'on lui demande.

    J'ai cru comprendre qu'il s'agissait d'un problème de closure, mais je ne comprends pas comment faire...
    Merci d'avance pour votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    for (var i=0; i<questions.length; i++){
     
        //div générale
        var div = document.createElement("div");
    	document.getElementById("contenu").appendChild(div);
     
    //N° de questions enfants de div generale
    	var titresElt = document.createElement("b");
    	titresElt.classList.add("titres");
    	titresElt.textContent = "Question " + [i+1] + " : ";
    	div.appendChild(titresElt); 
     
    	//énoncés enfants de div générale
    	var enoncesElt = document.createElement("i");
    	enoncesElt.textContent = questions[i].enonce; 
    	enoncesElt.style.display = "inline";
    	div.appendChild(enoncesElt);
     
     
     
     
    	//Création du bouton 
    		var boutonElt =  document.createElement("button");
        	boutonElt.textContent = "Réponse";
        	boutonElt.style.display="inline";
     
     
        //la réponse 
        	var reponseElt = document.createElement("div");
     
           	reponseElt.textContent = " " +questions[i].reponse;
           	var reponses = reponseElt;
          	reponses.style.display = "none";
     
     
    		div.appendChild(reponses);
    		div.appendChild(boutonElt);
     
    		}
     
    function clic (){
    		reponses.style.display = "inline";
    		boutonElt.style.display="none";
    			}
    boutonElt.addEventListener("click", clic);
    oui c'est mal indenté mais je n'arrête pas de tout bouger pour mes essais, je remettrai tout au propre par la suite.

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    J'ai fait quelques modifications et j'obtiens ça : http://jsbin.com/wejogoxuvo/edit?js,output

    - Je pense qu'il fallait entre autres mettre l'instruction boutonElt.addEventListener("click", clic); dans la boucle for...
    - J'ai dû faire un tableau de question/réponse pour le test...

    - J'ai remplacé ceci : titresElt.textContent = "Question " + [i+1] + " : "; par cela : titresElt.textContent = "Question [" + (i + 1) + "] : ";

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour Beginner,

    et merci d'avoir pris le temps de jeter un oeil ! Ton code fonctionne parfaitement !
    Après test, c'est le boutonElt.rep = reponseElt et this.rep.style.display qui ont fait que cela fonctionne, et j'aimerais comprendre pourquoi... Pourrais-tu prendre le temps de m'expliquer ? Ce serait vraiment sympa.

    Si non, pas de problème je comprends...

    Merci encore !

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Oui pas de soucis, je vais essayer...

    Alors tout comme toi j'ai fait des tests et voyant que cela ne fonctionnait pas j'ai décidé de faire un truc simple :

    Tout d'abord comme je disais je pense qu'il fallait entre autres mettre l'instruction boutonElt.addEventListener("click", clic); dans la boucle for... Oui car c'est nécessaire si on veut ajouter un listener à chaque bouton.
    Ensuite le problème c'était la fonction clic() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    function clic (){
            reponses.style.display = "inline";
            boutonElt.style.display="none";
                }
    Ici le problème c'est à quoi font référence "reponses" et "boutonElt" ? Apparemment toujours au dernier bouton et à la dernière réponse... En fait écrit comme ça, je ne vois pas comment ils pourraient faire référence au bouton sur lequel on clique et c'est pourtant ce que l'on souhaite...

    Alors j'ai pensé sauvegarder une référence (afin de pouvoir y accéder par la suite) de chaque élément div contenant la réponse dans le bouton correspondant en écrivant : boutonElt.rep = reponseElt;. Du coup chaque boutonElt a un objet rep auquel on pourra accéder dans la fonction clic()...

    Après on modifie la fonction clic() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function clic(event) {
            this.rep.style.display = "inline";
            this.style.display = "none";
    }
    Le mot clé "this" fait référence au bouton sur lequel on clique et donc "this.rep" fait référence à la réponse correspondant à ce bouton (si tu préfères c'est une référence à l’élément div contenant la réponse correspondant à ce bouton).

    Je ne sais pas si c'est clair mais n'hésite pas à poser tes questions...

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    D'accord, j'ai compris !

    Merci beaucoup beaucoup, vraiment.
    Se former seul(e) n'est pas toujours facile...
    En tous cas j'ai bien compris tes explications, je cherchais effectivement un moyen de sauvegarder le nom de la variable à chaque itération mais je ne savais pas comment m'y prendre. C'est top !

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    De rien.

    Oui, j'ai vu que avais essayé de faire une sauvegarde mais comme cela ne fonctionnait pas j'ai supprimé cette partie-là.

    Citation Envoyé par pipiotte Voir le message
    Se former seul(e) n'est pas toujours facile...
    Oui ben justement je t'informe qu'il y a ceci en ce moment :
    Mise en place d'une série d'exercices pour apprendre le JavaScript et Node.js


  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ah oui je n'avais pas vu.
    J'y vais de ce pas

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Bon courage alors...

Discussions similaires

  1. [M1][W1][D1?][N1?] Quelques suggestions de Question/Réponse.
    Par Mathieu Francesch dans le forum Contribuez
    Réponses: 5
    Dernier message: 23/08/2006, 13h37
  2. Conseils pour l'écriture de questions/réponses pour les FAQ
    Par LittleWhite dans le forum Contribuez
    Réponses: 0
    Dernier message: 18/05/2006, 19h15
  3. [FLASH MX] Animation sur bouton en boucle
    Par mascagne dans le forum Flash
    Réponses: 3
    Dernier message: 04/03/2006, 10h36

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