Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modifier en temps réel un bouton

Sujet résolu
    15 novembre 2017 à 22:11:27

    Bonjour :)

    J'aurai besoin d'un coup de main. J'ai un bouton qui lorsque je clique dessus, m'ouvre un code Javascript.

    <li><a class="waves-effect waves-light btn" onclick="tool();"><i class="material-icons left">play_circle_outline</i>Démarrer le flux </a></li>
    function tool() {
    			
    			Materialize.toast('<i class="material-icons left">refresh</i> Démarrage de votre flux en cours...', 4000);
    			setTimeout(tool2, 3000);
    							
    			
    		}
    		
    		function tool2() {
    			
    			setTimeout(Materialize.toast('<i class="material-icons left">thumb_up</i> Votre flux a été démarré avec succès !', 4000));
    
    			
    		}

    Et j'aimerai que automatiquement, et sans changer de page que le bouton change pour en afficher un avec un autre texte.

    Merci d'avance ;)



    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2017 à 22:26:31

      Salut,

      Mauvais forum => Javascript ;)

      ++

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2017 à 22:32:05

        Bonsoir, sujet déplacé en JS.

        -
        Edité par AbcAbc6 16 novembre 2017 à 11:48:28

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2017 à 11:40:45

          Salut,

          Pour changer le texte de ton bouton, mets lui un ID et dans ta fonction tu rajoutes :

          document.getElementById("ID").text = "Ah"

          Et si tu veux garder ton icone "materials-icons" il faut que tu rajoutes un span à l'intérieur avec l'id comme ça :

          <li><a class="waves-effect waves-light btn" onclick="tool();"><i class="material-icons left">play_circle_outline</i><span id="texte_bouton">Démarrer le flux </span></a></li>
          

          Puis dans ta fonction :

          document.getElementById("texte_bouton").text = "Arrêter"





          -
          Edité par PedroC 16 novembre 2017 à 11:51:50

          • Partager sur Facebook
          • Partager sur Twitter
            16 novembre 2017 à 11:54:14

            Pourquoi .textContent plutôt que .text?

            Il y a une différence entre les 2 ? (vraie question)

            (Et j'disais pas ça méchamment chill :p)

            :zorro:

            • Partager sur Facebook
            • Partager sur Twitter
              16 novembre 2017 à 11:57:14

              https://stackoverflow.com/questions/12679813/how-to-change-button-text-or-link-text-in-javascript

              ;)

              EDIT: ceci est intéressant:

               It's very fast, and cross browser compatible.
              People use .innerHTML because the DOM standard .textContent isn't implemented in some browsers,
              especially older IE. But .innerHTML is an HTML parser, so it's a bit of a hackish way to go.
              Working directly with the text node is very clean.



              -
              Edité par christouphe 16 novembre 2017 à 11:59:26

              • Partager sur Facebook
              • Partager sur Twitter
                16 novembre 2017 à 12:01:50

                Je viens de voir que pour un <button> .text ne marche pas (il faut donc .textContent), mais pour un <a></a> (ce qui est ton cas) le .text a l'air de suffire !

                -
                Edité par PedroC 16 novembre 2017 à 12:02:11

                • Partager sur Facebook
                • Partager sur Twitter
                  16 novembre 2017 à 12:06:05

                  il suffit de faire une recherche ;) voir les lien que j'ai fourni ;)

                  ++

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 novembre 2017 à 12:11:27

                    Et bien avant que tu ne l'écrive, j'avais jamais entendu parler de cette propriété. 

                    Elle existe bien sous chrome mais elle n'est pas standard (en tout cas, j'ai rien trouvé ici : https://www.google.fr/search?q=element.text)

                    Après quelques tests (sous chrome uniquement)

                    • element.text ne fonctionne que si l'élément ne contient qu'un noeud de texte
                    • element.textContent renvoie le contenu textuel de l'élément meme s'il contient plusieurs type de noeuds

                    C'est pas clair, donc voici un exemple :

                    <p>Clic sur <a href="lien.php" >ce lien</a></p>
                    const p = document.querySelector('p');
                    const a = document.querySelector('a');
                    
                    p.text; // non défini
                    a.text; // "ce lien"
                    
                    p.textContent; // "Clique sur ce lien"
                    a.textContent; // "ce lien"
                    
                    p.text = "efface tout"; // ne fait rien (à part ajouter une nouvelle propriété à p)
                    a.text = "ce nouveau lien"; // change la valeur du noeud de texte
                    
                    p.textContent = "efface tout"; // remplace tout le contenu par un noeud de texte "efface tout"
                    a.textContent = "ce nouveau lien"; // change la valeur du noeud de texte.

                    EDIT : effectivement, avec un bouton, ça marche pas, raison de plus pour ne pas utiliser cette propriété qui n'existait pas il y a 35 minutes


                    -
                    Edité par LCaba 16 novembre 2017 à 12:14:53

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 novembre 2017 à 12:19:19

                      Bonjour, 

                      Merci pour vos réponses. Depuis hier soir, je jette un œil sur un internet, et il faut utiliser Ajax. 

                      Car il me faudrait une suite en AJAX :

                      • Vérifier si la personne à cliquer sur le bouton
                      • Si la bouton est cliqué, alors modifier le bouton pour laisser un nouveau arriver
                      • Puis laisser attendre approximativement 5 secondes
                      • Puis afficher un message
                      • Puis modifier le bouton

                      Je suis encore, entrain de chercher des cours sur l'Ajax pour apprendre un petit peu. Mais votre aide, serait la bienvenue

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 novembre 2017 à 12:34:18

                        Si tu part de zéro, vaut mieux utiliser l'API fetch qui est plus simple d'utilisation que l'API XMLHttpRequest(). Le seul inconvénient et que les vieux navigateurs de la supporte pas. Un exemple : 

                        <button>Cliquer ici pour charger du contenu</button>
                        <div></div>
                        const button = document.querySelector('button');
                        const div= document.querySelector('div');
                        
                        button.addEventListener('click', e => { // fonction appelée au clic
                          button.setAttribute('disabled', '');
                          fetch('url.com/page.php') // lance une requête
                          .then(response => {  // fonction appelée une fois la réponse reçue
                            response.text()
                            .then(text => { // fonction appelée une fois la réponse traitée
                              button.removeAttribute('disabled');
                              div.textContent = text;
                            });
                          });
                        });

                        https://developer.mozilla.org/fr/docs/Web/API/Fetch_API/Using_Fetch 

                        https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Fonctions/Fonctions_fl%C3%A9ch%C3%A9es

                        -
                        Edité par LCaba 16 novembre 2017 à 12:36:51

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 novembre 2017 à 19:36:55

                          Cependant, par exemple si dans mon fichier il y'a : <p>test</p>. Il m'écrit directement les balises :/
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 novembre 2017 à 23:47:38

                            C'est normal.

                            Si tu veux mettre du HTML il faut utiliser innerHTML.

                            Si tu mets que du texte il faut préférer textContent car c'est plus performant

                            -
                            Edité par LCaba 16 novembre 2017 à 23:48:36

                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 novembre 2017 à 10:43:33

                              D'accord, ok. Mais à quoi sert le fetch url.com/page.php ?

                              C'est obligatoire, d'aller récupérer dans un fichier ? Ou l'on peut l'écrire nous même dans le code ?

                              Edit : Après avoir cherché un petit peu. Voilà, ce que j'ai écris ! 

                              const button = document.querySelector('button');
                              const div= document.querySelector('div');
                               
                              button.addEventListener('click', e => { // fonction appelée au clic
                                button.setAttribute('disabled', '');
                                document.write("<button disabled>Démarrage en cours...</button>");
                                timeout: 3000;
                                document.write("test");
                                fetch('thomas.php') // lance une requête
                                .then(response => {  // fonction appelée une fois la réponse reçue
                                  response.text()
                                  .then(text => { // fonction appelée une fois la réponse traitée
                                    button.removeAttribute('disabled');
                                    div.innerHTML = text;
                                  });
                                });
                              });


                              Pour le moment, ça fonctionne plutôt bien. Mais là, j'essaye de mettre un temps entre les document.write

                              -
                              Edité par CharlesSauvat 17 novembre 2017 à 11:25:06

                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 novembre 2017 à 14:47:08

                                CharlesSauvat a écrit:

                                C'est obligatoire, d'aller récupérer dans un fichier ? Ou l'on peut l'écrire nous même dans le code ?

                                Non, c'est toi qui a parlé d'Ajax, alors je t'ai montré un exemple.

                                l'utilisation de document.write() est à bannir : https://openclassrooms.com/courses/bonnes-pratiques-javascript 

                                tu peux soit créer un nouveau bouton avec document.create ou element.innerHTML, ou modifier le bouton existant



                                -
                                Edité par LCaba 17 novembre 2017 à 14:58:18

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 novembre 2017 à 15:09:34

                                  J'ai modifié mon code : 

                                  function	start_flux(elem)
                                  {
                                  	var localelem = elem;
                                    window.elem = localelem;
                                  	localelem.setAttribute("disabled", true);
                                    localelem.innerHTML = 'Veuillez patienter ...';
                                    $.get("https://api.icndb.com/jokes/random?firstName=f", 		function( data ) {
                                    	
                                    	localelem.removeAttribute("disabled");
                                    	localelem.innerHTML = "Stopper le flux";
                                      localelem.href="test.php";
                                  	});
                                  }

                                  Qu'en penses tu ? 
                                  Maintenant faudrait que j'arrive à modifier l'apparence du bouton

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 novembre 2017 à 16:16:54

                                    Je comprends pas ce que tu essaies de faire ligne 3 à 4. Pourquoi créer une variable globale ?

                                    Pour modifier l'apparence d'un élément en JS, tu as deux options : soit modifier la propriété style :

                                    element.style.color = "red";


                                    Soit modifier sa classe et gérer le style dans le CSS :

                                    element.classList.add("waiting");

                                    La seconde option est préférable, surtout si y a beaucoup de propriété CSS à modifier.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 novembre 2017 à 19:03:23

                                      D'accord, mais comment je peux introduire ça dans mon code ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 novembre 2017 à 19:16:40

                                        Regarde la documentation sur le sujet, notament sur les sites du MDN ou du W3schools et lis des tutos ;)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 novembre 2017 à 19:19:23

                                          J'ai jeté un œil sur OpenClassrooms, j'ai écris ça pour l'instant : 

                                          localelem.innerHTML = "<i class='material-icons left'>stop</i>Stopper mon flux" + myDiv.style.backgroundColor;
                                          
                                          <style type="text/css">
                                          #myDiv {
                                                  background-color: orange;
                                              }
                                          </style>
                                          
                                          
                                          <a href="#" class="btn waves-effect waves-light green darken-1" style="margin-left: 10px;" onclick="start_flux(this)" id="myDiv"><i class="material-icons left">play_circle_outline</i>Démarrer le flux</a>


                                          J'ai modifié mon code et je pense avoir trouvé : 

                                          localelem.style.Color = 'blue';
                                            	localelem.innerHTML = "<i class='material-icons left'>stop</i>Stopper mon flux";

                                          Mais maintenant, je n'arrive toujours pas à modifier ça

                                          <a href="#" class="btn waves-effect waves-light green darken-1" style="margin-left: 10px;" onclick="start_flux(this)"><i class="material-icons left">play_circle_outline</i>Démarrer le flux</a>

                                          Et la remplacer par ça

                                          <a class="btn waves-effect waves-light red accent-2">button</a>

                                          EDIT FINAL : J'ai réussi au final pour les intéressé :)

                                          $(localelem).removeClass('green').addClass('red');
                                            	localelem.innerHTML = "<i class='material-icons left'>stop</i>Stopper mon flux";






                                          -
                                          Edité par CharlesSauvat 17 novembre 2017 à 19:51:21

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Modifier en temps réel un bouton

                                          × 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