Partage
  • Partager sur Facebook
  • Partager sur Twitter

appliquer un event a un input

Sujet résolu
    2 juin 2009 à 21:08:31

    Bonjour a tous.
    Voila j'ai posté un sujet hier pour demander de l'aide afin d'appliquer un event a un input via javascript.

    j'avais donc ce code:

    for(var i=0;true;i++){
    	if(document.getElementsByTagName('input')[i].type == 'hidden'){
    		var input = document.getElementsByTagName('input')[i];
    		value = input.style.background = '#0040ff';
    		input.title = input.name;
    		input.type = 'text';
    		input.onfocus = function() {alert('test');};
    	}
    }
    


    qui ne marchait pas. On m'a conseillé de recréer un input et de remplacer l'ancien par le nouveau
    j'ai donc créé:

    for(var i=0;i < document.getElementsByTagName('input').length;i++){
    	if(document.getElementsByTagName('input')[i].type == 'hidden'){
    		var input = document.getElementsByTagName('input')[i];
    		var newInput = document.createElement("input");
    		
    		newInput.style.background = '#0040ff';
    		newInput.title = input.name;
    		newInput.type = 'text';
    		newInput.value = input.value;
    		newInput.name = input.name;
    		newInput.onFocus = function() { hide(); };
    		
    		input.parentNode.replaceChild(newInput, input);
    		
    	}
    }
    


    non seulement ca ne marche pas, mais en plus je ne peux jamais prévoir si l'input que je transforme n'aura pas d'autres attributs(et d'autres events en plus de ca...) donc cette solution ne me satisfait pas.

    Auriez vous des suggestions pour m'aider a terminer ce script?
    merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 juin 2009 à 8:12:28

      var inputs = document.getElementsByTagName('input'),
          newInput, input,
          i, l=inputs.length;
      
      for(i=0; i < l; i++){
          input = inputs[i];
          if (input.type === "hidden") {
              
              newInput = document.createElement("input");
              
              (function setAttributes () {    
                  var attr, n, l2 = input.attributes.length;
                  
                  for (n=0; n < l2; n++) {
                      attr = input.attributes[n].name;
                      if (attr !== "type" && attr !== "class") {
                          newInput.setAttribute(attr, input.getAttribute(attr));
                      }
                      if (input.className) {
                          newInput.className = input.className;
                      }
                  }
              })();
              
              newInput.style.background = '#0040ff';
              newInput.type = 'text';
              newInput.onfocus = function() { hide(); };
              
              input.parentNode.replaceChild(newInput, input);
          }
      }
      

      • Partager sur Facebook
      • Partager sur Twitter
        3 juin 2009 à 21:09:33

        j'ai tenté mais pas moyen plus aucun input n'est transformé
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          4 juin 2009 à 0:36:46

          Comme qui dirait : «Chez moi ça marche».

          Donnes ton code complet.
          • Partager sur Facebook
          • Partager sur Twitter
            4 juin 2009 à 5:36:51

            je te propose ceci:

            //Cette fonction servira à ajouter les gestionnaires d'évènements
            function aGE(element, typeDEvenement, gestionnaireDEvenement, phaseDeBouillement)
            {
            if(element.addEventListener)
                element.addEventListener(typeDEvenement, gestionnaireDEvenement, phaseDeBouillement);
            else if(element.attachEvent)
                element.attachEvent("on"+typeDEvenement, gestionnaireDEvenement);
            }
            
            var inputs = document.getElementsByTagName('input');
            for(var i=0; i<inputs.length; i++)
              {
              if(inputs[i].type == 'hidden')
                {
                inputs[i].value = inputs[i].style.background = "#0040ff";
                inputs[i].title = inputs[i].name;
                inputs[i].type = "text";
                aGE(inputs[i], "focus", function () {alert('allo');}, true);
                }
            }
            //Si tu veux tu peux aussi mettre une fonction à toi exemple
            /*
            function exemple()
            {
            alert('Voici une fonction exemple');
            }
            
            aGE(inputs[i], "focus", exemple, true);
            ou 
            aGE(inputs[i], "focus", function (){exemple();}, true)
            */
            


            EDIT: Corrigé un bug d'accolade.
            • Partager sur Facebook
            • Partager sur Twitter
              4 juin 2009 à 18:51:48

              @nod_ :le script complet est celui que tu m'a passé :p je n'ai rien d'autre sur ce script

              @davilink pas mieux :s aucun input transformé non plus

              peut etre est ce greasemonkey qui pose probleme?
              • Partager sur Facebook
              • Partager sur Twitter
                5 juin 2009 à 2:30:37

                bha de toute facon c'est un peu normal que sa fonctionne pas, car tu peux pas focuser un input
                hidden.

                EDIT: Mon Code avait un bug, il manquait une accolade. je l'ai corrigé, mais comme j'ai dit il faudrait que ton ation soit déclenché d'une autre façon.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 juin 2009 à 8:35:07

                  var inputs = document.getElementsByTagName('input'),
                      newInput, input,
                      i, l=inputs.length;
                  
                  var addEvent = function(obj_, event_, fct_)
                  {
                      if (obj_.addEventListener) {
                          obj_.addEventListener(event_, fct_, true);
                      }
                      else if (obj_.attachEvent && !(/this\./g.test(fct_.valueOf()))) {
                          obj_.attachEvent('on' + event_, fct_);
                      }
                      else {
                          obj_['on' + event_] = fct_;
                      }
                  };
                  
                  for(i=0; i < l; i++){
                      input = inputs[i];
                      if (input.type === "hidden") {
                          newInput = document.createElement("input");
                          
                          (function setAttributes () {    
                              var attr, n, l2 = input.attributes.length;
                              
                              for (n=0; n < l2; n++) {
                                  attr = input.attributes[n].name;
                                  if (attr !== "type" && attr !== "class") {
                                      newInput.setAttribute(attr, input.getAttribute(attr));
                                  }
                              }
                              if (input.className) {
                                  newInput.className = input.className;
                              }
                          })();
                          
                          newInput.style.background = '#0040ff';
                          newInput.type = 'text';
                          addEvent(newInput, 'focus', function() { hide(); });
                          
                          input.parentNode.replaceChild(newInput, input);
                      }
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juin 2009 à 9:57:28

                    davilink j'ai corrigé l'accolade je l'avait vue^^

                    mais le truc c'est justement que je transforme l'hidden en text et le text, lui peut etre focus...

                    EDIT: Tillers bien vu le script marche très bien!
                    merci beaucoup^^ maintenant faut que j'aille le comprendre^^
                    merci encore

                    EDIT2: j'ai regardé le code j'ai compris le principal mais j'ai encore deux zones de flou

                    if (input.className) {
                    newInput.className = input.className;
                    }

                    je comprends pas bien ce passage, je voit que ca a rapport avec l'attribut class mais pourqu'oi il ne pouvait pas passer avec les autres?

                    et

                    la variable addEvent ou tu passe ta fonction je voit pas bien a quoi elle sert
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      5 juin 2009 à 10:35:25

                      className tu ne peux pas le mettre pa setAttribute de façon fiable (merci IE6 et 7), alors il faut ruser. Le if, c'est la ruse.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juin 2009 à 15:56:39

                        var addEvent = function(obj_, event_, fct_)
                        {
                        


                        Ce code est équivalent à celui-ci :

                        function addEvent(obj_, event_, fct_)
                        {
                        


                        Il a juste créé une fonction pour ajouter proprement des événements, et de manière compatible pour tous les browsers.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juin 2009 à 4:04:53

                          Je voudrais savoir pourquoi il faut absolument remplacer le input par newInput ??. changer seulement l'attribut type ne fait pas ?

                          J'aimerais savoir, car s'il faut absolument faire ceci, il doit avoir une raison et j'aimerais pouvoir la connaître pour pouvoir répondre correctement lors d'un prochain problème qui serait semblable.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            6 juin 2009 à 4:39:16

                            C'est à cause de IE. Il n'accepte pas qu'on change le type d'un input, il faut en crée un nouveau.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juin 2009 à 4:56:51

                              A ok merci pour l'info. Mais comment fait-tu pour focuser un champ caché ? : o_O
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                6 juin 2009 à 5:00:08

                                Tu fais pas :p regarde le code de Tiller, y'a pas de focus sur un champ caché. C'est le nouvel input qui a un type "texte" que l'on donne une fonction lors du focus.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 juin 2009 à 5:24:23

                                  bha alors c'est sur que mon code fonctionnais pas, j'avais comprit que le gars voulait qu'on focus sur le champ caché et lorsqu'il avait le focus, le champ devenait en texte. je me doutais bien qu'on pouvait pas.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  appliquer un event a un input

                                  × 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