IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

aide pour les closures


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 115
    Par défaut aide pour les closures
    Bonjour, je crée un slideshow, avec une grosse image en haut et des miniatures en bas. L'image du haut se déplace en fonction de la vignette que j'ai choisie en bas.
    illustration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var elementimg = document.querySelectorAll('#navigation li'); /* Je sélectionne toute les balises li */
    for (var i = 0, c = elementimg.length; i < c; i++) {
    elementimg[i].addEventListener('click', function() {
    document.querySelector('section nav ul').style.marginLeft= "-"+ i*940+"px"; /* Je décale "ul" sur la gauche en fonction de la place de la balise li*940 pixels. ex: je clique sur la troisieme balise li, la balise ul se déplace de 2820 pixels sur la gauche */
    }, false);		
    }
    Le problème de cette fonction, c'est qu'au final quelque soit le <li> sur le quel je cliquerais, seul la plus grande valeur de "i" sera retenue, c'est à dire la dernière valeur de "i" dans sa boucle. <ul> se déplacera toujours du même nombre de pixels sur la gauche.
    Il faut donc que la variable "i" garde ses différentes valeurs dans chacune des fonctions associé eux événements sur mes différent <li>.
    J'ai crus comprendre que les closures servaient précisément dans ce cas précis.
    Pouvez vous me le confirmer?
    merci

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    il faut utiliser une closure pour construire la fonction annonyme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var elementimg = document.querySelectorAll('#navigation li'); /* Je sélectionne toute les balises li */
    for (var i = 0, c = elementimg.length; i < c; i++) {
      elementimg[i].addEventListener('click', (function(offset) {
        return function() {
          document.querySelector('section nav ul').style.marginLeft= offset; 
        }
      })("-"+ i*940+"px"), 
      false);		
    }
    AJYT

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 115
    Par défaut
    merci pour ton aide, (ca marche).
    Donc si j'ai bien compris le principe, on peux schématiser les closures ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (function(/* parametre1*/) {
        return function()/* permet de créer une fonction anonyme */  {
          /* construction de la fonction, qui prendra les valeur de parametre 1*/
        }
      })(/*valeur du parametre1 */)
    Donc a chaque tour de boucle , je garde la valeur de la variable i du tour en cours, pour créer une nouvelle fonction avec cette valeur.
    Je voudrais maintenant pouvoir lire le contenue de la balise cliquée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var elementimg = document.querySelectorAll('#navigation li');
    for (var i = 0, c = elementimg.length; i < c; i++) {
      elementimg[i].addEventListener('click', (function(offset,test) {
     
        return function() {
          document.querySelector('section nav ul').style.marginLeft= offset;
    alert(test.innerHTML);
     
        }
      })("-"+ i*940+"px",this), 
      false);
     
    }
    étrangement, le pop up ne me revoit rien.

Discussions similaires

  1. [PHP-JS] Besoin d'aide pour les bases en php !
    Par stevefigueras dans le forum Langage
    Réponses: 1
    Dernier message: 15/12/2006, 13h36
  2. [Conception] Aide pour les liaison entre 2 table
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/09/2006, 13h03
  3. Besoin d'aide pour les dates
    Par Aurore_atmo dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/07/2006, 15h37
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo