Partage
  • Partager sur Facebook
  • Partager sur Twitter

Paramètre sur fonction appelée via EventListener

Sujet résolu
    2 avril 2020 à 18:47:34

    Bonjour,

    je suis en train de suivre le cours "Créer des pages web interactives avec Javascript" et je voudrais faire l'exercice du quiz interactif, le but est d'afficher des questions suivies d'un bouton, bouton qui fait afficher les réponses lors du clic. 

    J'aimerais que ma fonction afficher, appelée via un EventListener, puisse recevoir un argument autre que celui envoyé par l'EvenListener. 

    J'ai tenté quelque chose du style :

    buttonElt.addEventListener("click", afficher(i));

     En soit, je voudrais envoyer à ma fonction l'id du bouton, afin d'afficher la réponse correspondante.

    Voici mon code :

    function afficher (id) {
        
        parentElt = document.getElementById(id);
        var reponse = questions[id][reponse];
        var reponseElt = document.createElement("p");
        reponseElt.textContent = reponse;
        parentElt.replaceChild(reponseElt, getElementById[id]);
        //Affichage de la réponse
    
    }
    var questions = [
        {
            enonce: "Combien font 2+2 ?",
            reponse: "2+2 = 4"
        },
        {
            enonce: "En quelle année Christophe Colomb a-t-il découvert l'Amérique ?",
            reponse: "1492"
        },
        {
            enonce: "On me trouve 2 fois dans l'année, 1 fois dans la semaine, mais pas du tout dans le jour... Qui suis-je ?",
            reponse: "La lettre N"
        }
    ];
    
    divElt = document.getElementsByTagName("div")[0];
    for (var i = 0; i < questions.length; i++) {
        var question = questions[i];
        var enonce = question["enonce"]; 
    
        var enonceElt = document.createElement("p");
        enonceElt.textContent = enonce;
        divElt.appendChild(enonceElt);
        //affichage de l'énoncé
    
        buttonElt = document.createElement("button");
        buttonElt.textContent = "Afficher la réponse";
        buttonElt.setAttribute("id", i)
        enonceElt.appendChild(buttonElt);
        //affichage du bouton
    
        buttonElt.addEventListener("click", afficher(i));
    
    }
    

    Le résultat : seule la première question est affichée, et la console m'envoie :

    Uncaught ReferenceError: getElementById is not defined

        at afficher (quiz.js:7)

        at quiz.js:42

    J'espère avoir été compris :D

    Merci de votre aide et bonne soirée.

    • Partager sur Facebook
    • Partager sur Twitter
      2 avril 2020 à 21:06:36

      Bonjour

      Ligne 7 : getElementById n'est attaché à rien !

      Remplace par document.getElementByIdet ça ira un peu mieux.

      Un peu car tu vas te retrouver avec une autre erreur ;-)

      (C'est en galérant qu'on devient forgeron - je me comprends)

      Cordialement.

      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2020 à 10:44:32

        Merci beaucoup Domi65 pour ton aide, et merci aussi de me laisser galérer, je pense que c'est une bonne pédagogie :D

        (même si je t'en veux un peu quand même ^^)

        J'ai mis l'id sur le paragraphe et non sur le bouton, et j'ai remplacé 

        parentElt.replaceChild(reponseElt, getElementById[id]);

        par

        parentElt.replaceChild(reponseElt, parentElt.childNodes[0]);

        Parce que parentElt est le bouton, et que l'on remplace son enfant... Qui est le même bouton !

        Oui, j'ai mis tout ce temps à le remarquer :-°

        J'ai cru comprendre qu'il était impossible d'envoyer directement des paramètres dans une fonction appelée via EventListener, donc j'ai essayé de faire une fonction qui retourne celle voulue, avec le bon paramètre, du style :

        function fonctionFinale (param) {
            console.log(param);
        }
        function returnFonction (param) {
            return fonctionFinale(param);
        }
        test = returnFonction("ceci est un test");

        Afin de pouvoir insérer test dans l'EventListener.

        Bien entendu, ç'aurait été trop beau, donc ça ne marche pas. fonctionFinale est appelée ligne 7. Domi65 ou n'importe qui aurait une solution ? Siouplé ? :(

        Bonne journée






        -
        Edité par sharklouis 3 avril 2020 à 10:46:39

        • Partager sur Facebook
        • Partager sur Twitter
          3 avril 2020 à 11:48:54

          Bonjour.

          Pourquoi faire un return de fonctionFinale dans la fonction returnFonction, alors que la fonction fonctionFinale ne retourne rien du tout ?

          Par conséquence la variable test n'aura aucune valeur de définie.

          -
          Edité par Lartak 3 avril 2020 à 11:49:54

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            3 avril 2020 à 12:31:35

            Bonjour,

            j'ai essayé d'expérimenter, et je voulais en fait que la variable test soit la fonction fonctionFinale, passée avec le l'argument "ceci est un test", afin de pouvoir passer test dans l'EventListener.

            Je sais pas si je me fais bien comprendre:D

            • Partager sur Facebook
            • Partager sur Twitter
              3 avril 2020 à 13:47:36

              Bonjour sharklouis,

              Quelques exemples  :

              https://codepen.io/Zonecss/pen/xxGmWXw

              • Partager sur Facebook
              • Partager sur Twitter
              Découvrez les Css avec la zonecss.fr
                3 avril 2020 à 14:43:36

                Bonjour AliasDmc,

                déjà, merci de ton aide.

                J'ai regardé ton lien, mais le problème avec cette méthode c'est qu'il faut faire une fonction pour chaque élément.

                Je ne l'ai pas dit, mais c'est pour cette raison que j'ai demandé si je pouvais envoyer un paramètre via un EventListener, pour ne pas avoir besoin de rajouter une fonction à chaque fois que je rajouterai une question.

                Désolé de mon exigence ^^

                • Partager sur Facebook
                • Partager sur Twitter
                  3 avril 2020 à 15:52:36

                  Bonjour sharklouis,

                  Non, il suffit d'ajouter une nouvelle entrée dans le tableau de question.

                  -
                  Edité par AliasDmc 3 avril 2020 à 16:00:18

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Découvrez les Css avec la zonecss.fr
                    3 avril 2020 à 17:45:04

                    Oh, les différentes fonctions représentent les différents moyens de faire, c'est ça ? 

                    La fonction initQuestion créé un EventListener pour chaque bouton, et affiche l'enonce.

                    Si le paramètre est mainC, alors tu crées un EventListener au clic, qui appelle la fonction afficherC, avec comme paramètre l'index de la réponse et le bouton a remplacer. (et le paramètre oEvent qui est envoyé automatiquement par l'EventListener)

                    Tu crées l'élément reponseElt à partir de la réponse du tableau, correspondant à l'index passé en paramètre de la fonction, et tu remplaces le bouton (this) par reponseElt.

                    J'ai tout bon ?:D

                    Je vais utiliser la méthode C, mais vu que j'aime pas utiliser des fonctions juste parce que ça marche, je voudrais savoir comment marche la fonction bind(), si ça te dérange pas.:-°

                    (Par contre on sort du sujet, peut-être continuer par messagerie privée ?)

                    En tout cas, merci beaucoup pour votre aide (et surtout de votre patience).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 avril 2020 à 18:08:46

                      Bonjour sharklouis,

                      C'est ca, mainC correspond à la méthode 3

                      https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/bind

                      Je ne réponds pas au mail, car je considère que tout le monde doit en profité (désolé)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Découvrez les Css avec la zonecss.fr
                        4 avril 2020 à 11:32:59

                        Pas de problème, encore merci à vous tous, je marque le sujet comme résolu.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Paramètre sur fonction appelée via EventListener

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown