Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de référence...

Sujet résolu
    8 avril 2009 à 21:16:26

    Bonjour,

    Voila je poste ici car j'ai un soucis de référence au niveau d'une variable.
    Je m'explique, en fait dans une boucle, à chaque tour je crée un élément 'a' (un lien en fait) sur lequel je lui met un événement onclick.

    Voici le bout de code js qui sera sûrement plus explicite:
    for(var i = 0; i < _nbPages; i++)
    {
    	var a = document.createElement("a");
    	a.innerHTML = (i != 0) ? ", " : "";
    	a.style.cursor = "pointer";
    	a.innerHTML += (i+1);
    	var tmp = i; // sinon il ne trouve pas i dans la function du dessous
    	a.onclick = function() { setPage(tmp); };
    	div.appendChild(a);
    }
    


    Le soucis de ce code, est qu'il garde en mémoire la dernière valeur de i.
    Ainsi, si j'ai 5 liens avec pour chaque lien une valeur de i différente, il garde la dernière.

    Je ne sais pas d'où ça vient, car je crée bien mes variables avec 'var'.

    Si quelqu'un sait comment remédier à ce problème ça m'aiderait énormément :)
    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2009 à 21:34:18

      Comme ça :
      for(var i = 0; i < _nbPages; i++){
      	var a = document.createElement("a");
      	a.innerHTML = (i != 0) ? ", " : "";
      	a.style.cursor = "pointer";
      	a.innerHTML += (i+1);
      	a.onclick = (function(page){ return function() { setPage(page); }; })(i);
      	div.appendChild(a);
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2009 à 21:41:09

        Ouaou merci beaucoup :)
        Par contre tu pourrais m'expliquer rapidement comment le 'i' dans est récupéré dans la fonction avec cette syntaxe, parce que je vois pas...
        • Partager sur Facebook
        • Partager sur Twitter
          8 avril 2009 à 21:49:06

          Fiou, vive les closures, ca marche bien, mais c'est compliqué a expliquer.
          En gros, les paramètres locaux sont sauvegardés dans une fonction :
          function test(chouette){
          alert(chouette);
          }
          test("aze");//afficher aze
          

          En partant de la, on va créer une fonction anonyme qui retiend la valeur de la variable :
          a.onclick = (function(page){ return function() { setPage(page); }; })(i);
          

          Va se transformer en :
          a.onclick = function() { setPage(page); }
          Sauf que grace a la créatin dynamique, page sera retenue en mémoire.
          Fin bon, ca marche bien en tout cas, chercher sur google plus d'infos ;) .
          • Partager sur Facebook
          • Partager sur Twitter
            8 avril 2009 à 21:58:39

            Oui merci pour l'explication aussi en tt cas :)
            • Partager sur Facebook
            • Partager sur Twitter
              9 avril 2009 à 11:59:11

              Super, merci à vous deux, j'ai rencontré le même problème et je commençais à m'arracher les cheveux.
              Donc mon crâne vous dit merci.
              • Partager sur Facebook
              • Partager sur Twitter

              Problème de référence...

              × 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