Partage
  • Partager sur Facebook
  • Partager sur Twitter

Soucis avec getElementByClassName

Sujet résolu
    20 novembre 2010 à 22:30:18

    Bonjour,
    J'ai chercher un temps sur le net, sur le site mais je n'ai ou pas compris ou trouvé comment faire fonctionner le getElementByClassName, J'ai dans mon html une class=boutton, que je souhaite faire changer de couleur au mousedown mais pas moyen de lancer ma fonction :x

    function boutton()
    	{
    		if (this.style.border=="1px solid white")
    			{
    				this.style.border="1px solid black";
    			}
    		else
    			{
    				this.style.border="1px solid white";
    			}
    	}
    function reconnaissance()// Lancement des fonctions
    	{		
    		var all_boutton=document.getElementsByClassName('boutton');
    		for ( var i=0; i>=all_boutton.length; i++)
    			{
    				if (all_boutton[i].onmousedown==true || all_boutton[i].onmouseup==true)
    					{
    						boutton();
    					}
    			}
    	}
    	
    window.onload=reconnaissance;
    


    Si vous sauriez me dire quelle bêtise j'ai fait :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 1:24:50

      2 petites choses avant de parler du code à proprement parlé :
      1) la fonction ne fonctionne pas sous IE.
      2) "getElementByClassName" hé hé, par chance t'as pas fais la faute dans le code, mais à l'écris tu la faite :D (cf. le 's').

      Pour la fonction, tu l'as bien utilisée, par contre c'est le reste qui plante surtout ça :
      if (all_boutton[i].onmousedown==true || all_boutton[i].onmouseup==true)
      La raison, tu appelle une fois la fonction, et tu vérifie si on passe dessus, ce qui sert pas à grand chose.

      La méthode que tu devrais faire, quand tu l'appelle la première fois, t'instancie les fonction onmousedown/up :
      all_bouton[i].onmousedown = function(){
         button();
      }
      all_bouton[i].onmouseup = function(){
         button();
      }
      

      Ce qui à chaque 'onmouse' appellera la fonction, et lancera 'button()'.

      J'espère avoir répondus à ton problème, bon courage ;) .
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2010 à 9:06:02

        Il y aussi un problème dans la boucle for :


        for ( var i=0; i>=all_boutton.length; i++)
        

        La boucle continue tant que la condition est vraie, donc ici, elle ne va même pas commencer car i n'est pas supérieur à all_boutton.length. Il faut écrire :

        for ( var i=0; i<all_boutton.length; i++)
        // ou mieux :
        for ( var i=0, n=all_boutton.length; i<n i++)
        


        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2010 à 11:40:23

          J'ai changer le signe de ma boucle for je ne sais pas pourquoi je l'ai pensé à l'envers mais bref.

          J'ai testé comme ceci mais je ne sort plus de ma boucle il y reste coincé :
          var all_bouton=document.getElementsByClassName('bouton');
          		for ( var i=0; i<=all_bouton.length; i++)
          			{
          				all_bouton[i].onmousedown=bouton();
          				all_bouton[i].onmouseup=bouton();
          			}
          


          j'ai essayer avec la méthode donné par lieo :

          var all_bouton=document.getElementsByClassName('bouton');
          		for ( var i=0; i<all_bouton.length; i++)
          			{
          all_bouton[i].onmousedown = function(){
             bouton();
          }
          all_bouton[i].onmouseup = function(){
             bouton();
          }
          


          Je sors bien de ma boucle seulement il n'y a aucune action lors de l'appuie sur les boutons :/


          }
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2010 à 13:05:01

            Essaie plutôt ceci :


            var all_bouton=document.getElementsByClassName('bouton');
            for ( var i=0; i<=all_bouton.length; i++){
            		all_bouton[i].onmousedown = all_bouton[i].onmouseup = bouton;
            }
            

            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2010 à 13:09:03

              :o On à le droit de faire ça O_o, c'est niquel ça marche merci beaucoup :D
              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2010 à 13:37:52

                Oui, mais ce qui est important, c'est l'absence de parenthèse. Avec les parenthèses, la fonction s'exécute, et ce n'est pas la fonction qui est affectée au mousedown mais son résultat.
                La méthode donnée par lieo ne fonction pas car le this ne renvoie pas à l'objet all_bouton[i] dans ce contexte
                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2010 à 15:05:28

                  Ha d'accord si je met les parenthèses j'envoie a ma fonction le onmousedown et non pas le contenu de all_bouton[i]? j'ai bien compris? ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 novembre 2010 à 17:13:07

                    Non, t'as rien compris :p
                    all_bouton[i] est un objet (un élément HTML).
                    .onmousedown est une méthode (=une fonction) de cet objet, déclenchée quand le bouton de la souris descend sur cet objet.
                    Donc, ce que tu affectes à all_bouton[i].onmousedown doit être une fonction. bouton est une fonction. bouton() n'est pas une fonction, c'est la valeur retournée par la fonction bouton lorsqu'elle s'exécute (c'est-à-dire, la valeur donnée à l'instruction return, ou undefined s'il n y a pas de return )
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 novembre 2010 à 15:18:41

                      Haa d'accord j'ai capito enfin je crois ^^ merci pour l'info, et le coup de pouce :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 novembre 2010 à 19:15:12

                        getElementByClassName reste une fonction incompatible : elle n'est pas implémentée par IE.

                        Voilà un copier-coller d'un de mes codes pour remplacer cette fonction :

                        function getElementsByClass(s /* , el */){
                        	var el,
                        		classes,
                        		list = [],
                        		nodeList,
                        		allChilds,
                        		child,childClasses,
                        		index,
                        		i,j,k,m,n,p;
                        		
                        	if(arguments.length>1){
                        		el = arguments[1];
                        	}else{
                        		el = document;
                        	}
                        	if(el.getElementsByClassName){
                        		nodeList = el.getElementsByClassName(s);
                        		for(i=0,n=nodeList.length;i<n;i++){
                        			list.push(nodeList[i]);
                        		}
                        		return list;
                        	}else{
                        		s = ''+s;
                        			
                        		classes = s.split(/\s/), // On crée un tableau des classes à rechercher
                        		list = [],
                        		allChilds = el.getElementsByTagName('*'), // On récupère tous les enfants de l'élément racine
                        		child,
                        		i = 0,
                        		m = allChilds.length,
                        		n = classes.length,
                        		childClasses = [];
                        		
                        		for(;i<m;i++){ // On parcours la liste des enfants
                        			child = allChilds[i];
                        			if(child.className!==''){
                        				childClasses = child.className.split(/\s/); // On crée un tableau des classes de l'enfant
                        				p = childClasses.length;
                        				for(j=0;j<n;j++){ // On parcours la liste des classes à rechercher
                        					for(index=-1,k=0;k<p;k++){ // On parcours la liste des classes de l'enfant
                        						if(childClasses[k]===classes[j]){ // Si l'une de ces classes est la classe recherchée, on arrête la recherche pour cette classe
                        							index = k;
                        							break;
                        						}
                        					}
                        					if(index===-1){ // Si la classe recherchée est introuvable arrête la recherche des autres classes.
                        						break;
                        					}
                        				}
                        				if(j===n){ // Si toutes les classes ont été trouvées, on ajoute l'élément à la liste
                        					list.push(child);
                        				}
                        			}
                        		}
                        		return list;
                        	}
                        };
                        


                        Exemples d'utilisation :

                        Avec un seul argument, la recherche s'effectue sur tout le document
                        getElementsByClass("classe_1 classe_2");
                        // Cherche les éléments ayant la classe "classe_1" ET la classe "classe_2"
                        

                        Le deuxième argument permet de restreindre la recherche à un élément :
                        getElementsByClass("une_classe", document.getElementById("un_element") ); 
                        // Cherche les éléments de classe "une_classe" dans l'élément de div "un_element".
                        


                        L'objet retourné n'est pas un nodeList mais un tableau (même sous les navigateurs standards, pour avoir le même comportement avec tous les navigateurs)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 novembre 2010 à 8:20:08

                          Je ne comptais pas le mettre sur IE mais je vais le garder de coté au cas ou encore mici :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 novembre 2010 à 8:32:53

                            Citation

                            Je ne comptais pas le mettre sur IE



                            Qu'est-ce que ça veut dire ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 novembre 2010 à 12:37:06

                              Qu'il n'en a rien à carrer d'IE ... :-°
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 novembre 2010 à 14:18:33

                                Oai ça c'est un fait lol mais je voulais juste dire qu'il ne sera pas utilisé pour mon projet du moins pour l'instant ya de forte chance pour que je doive m'en occupé aussi :x
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 novembre 2010 à 15:18:22

                                  Citation : LCaba

                                  for ( var i=0; i<all_boutton.length; i++)
                                  // ou mieux :
                                  for ( var i=0, n=all_boutton.length; i<n i++)
                                  




                                  Ou encore, puisque l’ordre n’a, ici, pas d’importance :
                                  for(var i = allButtons.length; i--;)
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 novembre 2010 à 20:37:03

                                    +1. mais si on est vraiment puriste, on met le var en début de fonction, et du coup, le for peut etre remplacer par while

                                    var i = allButtons.length;
                                    while( i--)
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 novembre 2010 à 21:18:39

                                      Citation : LCaba

                                      si on est vraiment puriste, on met le var en début de fonction


                                      À moins de décider que seuls Firefox et IE9 comptent, auquel cas l’on peut faire :

                                      for(let i = allButtons.length; i--;)
                                      

                                      (Le colorateur syntaxique utilisé par le site n’est même pas au courant de ce mot-clé.)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 novembre 2010 à 21:21:22

                                        \o/ Vive JS 1.7 et supérieur :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          25 novembre 2010 à 8:53:50

                                          J'arrive pas à faire marcher ton code ni sous FF4 ni sous Chrome... ?

                                          let, c'est pour faire une closure ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 novembre 2010 à 11:33:55

                                            Ca permet de faire des variables locales à des blocs qui normalement n'ont pas de closure, oui.

                                            <script type="text/javascript;version=1.7">
                                            var i = 18;
                                            for(let i=0;i<4;i++) {}
                                            alert(i); // Affiche 18
                                            </script>
                                            


                                            Précise la version dans le script. Ca marche sous FF3.6 aussi. ;)

                                            https://developer.mozilla.org/en/New_in_Javascript_1.7
                                            https://developer.mozilla.org/en/New_in_JavaScript_1.8
                                            https://developer.mozilla.org/en/New_in_JavaScript_1.8.1
                                            https://developer.mozilla.org/en/New_in_JavaScript_1.8.5
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              25 novembre 2010 à 14:18:26

                                              Merci pour tous les liens je regarderai ça ;)
                                              Sous Chrome, pas moyen ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                25 novembre 2010 à 14:32:41

                                                Google dit qu'apparemment non.
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Soucis avec getElementByClassName

                                                × 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