Partage
  • Partager sur Facebook
  • Partager sur Twitter

OnSubmit, quel bouton a été cliqué ?

Sujet résolu
    23 août 2010 à 10:14:59

    Bonjour,

    J'ai un formulaire qui a deux boutons : un bouton Cancel et un bouton Valider.
    Il y a un attribut onSubmit sur la balise form, afin de vérifier en javascript que tous les champs sont corrects.
    Cependant, si on clique sur le bouton Cancel, j'aimerais que ça ne fasse pas les vérifications... (Vu qu'on annule...)
    Et donc j'aimerais savoir si c'est possible de savoir, en javascript, quel a été le bouton cliqué ?
    (Je sais qu'on peut aussi mettre le bouton Cancel en type button et non submit, et mettre un onclick dessus, mais je n'aime pas beaucoup cette méthode... J'aimerais laisser le submit...)

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2010 à 12:29:33

      Après plusieurs tests (sur un peu tous les navigateurs), la solution la plus simple serait d'effectuer un changement de valeur au clic sur le bouton annuler et sur le bouton ok. Et dans la fonction, il faut tester si la valeur vaut celle définie par OK ou Annuler.

      Et il faudrait faire la même chose si le formulaire a été envoyé au clavier.
      • Partager sur Facebook
      • Partager sur Twitter
        23 août 2010 à 12:44:34

        Hum... Si je comprend bien, il faudrait que je mette un champ hidden qui aurait pour value le dernier bouton cliquer (Annuler ou Valider), c'est ça ?
        J'espérais qu'il y ai une façon toute simple, mais apparement, je vais devoir faire comme ça.

        Merci :)
        • Partager sur Facebook
        • Partager sur Twitter
          23 août 2010 à 12:46:26

          Pour récupérer côté PHP, il y a le value du Submit qui peut être récupéré, mais côté JS aucune solution cross-browser ( y a bien une solution pour Firefox et Opéra, mais pas trouvé pour les autres)

          EDIT: donc un champ hidden ou une simple variable globale que tu changes côté JS
          • Partager sur Facebook
          • Partager sur Twitter
            23 août 2010 à 13:46:53

            Salut,
            Je m'étais déjà posé la question et sur le moment j'avais eu la flemme de chercher. Cette fois j'ai ceci à proposer :

            Un petit bout de code un peu complexe mais simple d'utilisation. Je commence par créer une classe :

            function addEvent(el,even,fnc){
            	if (el.addEventListener){
            		el.addEventListener(even,fnc, false);   
            	}else if (el.attachEvent){
            		el.attachEvent('on' + even,fnc);
            	}
            }
            function EcouteForm(form){
            	var inputs = form.getElementsByTagName('input'), i,c,
            		o = this;
            	o.submitName = '';
            	for(i=0,c=inputs.length; i<c; i++){ // Pour tous les éléments input du formulaire
            		if(inputs[i].type==='submit'){ // Je récupère ceux qui sont de type submit
            			(function(inputSubmit){ // Une closure s'impose... http://www.siteduzero.com/tutoriel-3-123380-les-closures-en-javascript.html
            				addEvent(inputSubmit,'click',function(){ // Au clic sur le bouton...
            					o.submitName = inputSubmit.name; // ...je change l'attribut submitName de l'objet crée
            				});
            			})(inputs[i]);
            		}
            	}
            }
            


            Ensuite pour l'utilisation c'est simple :

            var form = document.getElementById('form'),
                ecouteForm = new EcouteForm(form); // Je crée un objet qui va écouter notre formulaire.
            
            addEvent(form,'submit',function(){
                if(ecouteForm.submitName==='Annuler'){
                    //...
                }else{
                    //...
                }
            });
            


            Je sais pas si c'est très propre, si un pro du js passe par là, j'aimerais bien qu'il me dise ce qu'il en pense ;) .
            • Partager sur Facebook
            • Partager sur Twitter
              23 août 2010 à 13:57:44

              Testé FF marche pas ? o_O

              <body>
              <form id="myform" method="post" action="?passe=true">
              <input type="text" name="valeur" value="ok" />
              <input type="submit" name="oui" value="ok" />
              <input type="submit" name="non" value="annuler" />
              </form>
              
              <script>
              function addEvent(el,even,fnc){
              	if (el.addEventListener){
              		el.addEventListener(even,fnc, false);   
              	}else if (el.attachEvent){
              		el.attachEvent('on' + even,fnc);
              	}
              }
              function EcouteForm(form){
              	var inputs = form.getElementsByTagName('input'), i,c,
              		o = this;
              	o.submitName = '';
              	for(i=0,c=inputs.length; i<c; i++){ // Pour tous les éléments input du formulaire
              		if(inputs[i].type==='submit'){ // Je récupère ceux qui sont de type submit
              			(function(inputSubmit){ // Une closure s'impose... http://www.siteduzero.com/tutoriel-3-123380-les-closures-en-javascript.html
              				addEvent(inputSubmit,'click',function(){ // Au clic sur le bouton...
              					o.submitName = inputSubmit.name; // ...je change l'attribut submitName de l'objet crée
              				});
              			})(inputs[i]);
              		}
              	}
              	addEvent(form,'submit',function(){
              		o.subitName = '';
              	});
              }
              var form = document.getElementById('myform'),
                  ecouteForm = new EcouteForm(form); // Je crée un objet qui va écouter notre formulaire.
              
              addEvent(form,'submit',function(){
              	alert(ecouteForm.submit);
                  if(ecouteForm.submit==='Annuler'){
                      //...
              		return false;
                  }else{
                      //...
              		return true;
                  }
              });
              
              </script>
              
              </body>
              

              alert retourne undefined ...
              • Partager sur Facebook
              • Partager sur Twitter
                23 août 2010 à 14:02:56

                Oups je me suis trompé en copiant. L'attribut de l'objet crée est "submitName" et non pas "submit" (j'ai édité).
                • Partager sur Facebook
                • Partager sur Twitter
                  23 août 2010 à 14:21:25

                  Ok autant pour moi, j'ai pas trop lu le code, j'aurais pu remarquer moi-même ^^

                  Par contre, un truc que je comprends pas, c'est le submit au clavier qui marche aussi ? Alors qu'il y a seulement un onclick. Je sais pas si tu as une explication ? ^^
                  Et j'essaie aussi une annulation du lancement du formulaire, mais le simple return false; marche pas :(

                  Un autre problème c'est :
                  /*addEvent(form,'submit',function(){
                  		//o.submitName = ''; Commenté, car comporte un bug.
                  	});*/
                  

                  (Tu avais o.subit d'ailleurs dans ton exemple)
                  Donc si tu mets juste, ça remet à zéro avant le test

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 août 2010 à 14:34:48

                    Merci pour ces codes que j'ai mis un peu de temps à comprendre :)

                    Mais je me suis contentée d'un simple :
                    <input type="hidden" id="pushedbutton" value="1"/>
                    avec :
                    <input type="submit" name="edit" value="Edit" onclick="document.getElementById('pushedbutton').value='1';"/>
                    et
                    <input type="submit" name="cancel" value="Cancel"onclick="document.getElementById('pushedbutton').value='0';"/>

                    Et comme ça, dans la vérification du formulaire, j'ai un :
                    if(document.getElementById("pushedbutton").value == 0)
                    return true;
                    Et même si ce n'est pas ce qu'il y a de plus propre, ça marche très bien..

                    Merci pour les réponses et l'aide en tout cas :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 août 2010 à 14:39:57

                      Citation : birdy42

                      Par contre, un truc que je comprends pas, c'est le submit au clavier qui marche aussi ? Alors qu'il y a seulement un onclick. Je sais pas si tu as une explication ?



                      En fait ça dépend du navigateur. IE va soumettre le formulaire comme si on faisait un simple form.submit() (aucun bouton n'est cliqué), alors que les autres "cliquent" sur le bouton submit qui suit le champs dans lequel tu tapes entrée. Ce code suffit à s'en rendre compte (en regardant l'url) :

                      <form>
                      <input type="text" name="texte" />
                      <input type="submit" name="valider" value="Valider"/>
                      </form>
                      



                      Citation : birdy42

                      Et j'essaie aussi une annulation du lancement du formulaire, mais le simple return false; marche pas



                      Avec addEventListener, pour annuler l'action par défaut de l'événement :

                      event.preventDefault && event.preventDefault()
                      


                      Avec attachEvent :

                      window.event.returnValue = false
                      


                      Donc le code cross-browser c'est ça :

                      event.preventDefault && event.preventDefault();
                      event.returnValue = false;
                      


                      Citation : birdy42

                      Donc si tu mets juste, ça remet à zéro avant le test



                      Oui j'ai vu, j'ai viré ce bout de code d'ailleurs.

                      Au final il reste encore pas mal d'améliorations à apporter
                      • Partager sur Facebook
                      • Partager sur Twitter

                      OnSubmit, quel bouton a été cliqué ?

                      × 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