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

jQuery Discussion :

Closure avec fonction anonyme, où est la faute ?


Sujet :

jQuery

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut Closure avec fonction anonyme, où est la faute ?
    Bonjour,

    J'effectue un appel ajax qui me retourne en json un tableau d'objets. Pour chaque objet, je veux créer un élément clicable.
    en version simplifiée (je vous ai enlevé les objets imbriqués et les attributs pour l'exemple), ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $.Ajax (...)
    .done(function(datas) {
       for(var i=0;i<datas.length;i++)
          monJQObj.append("<div />")
                        .text(datas[i].name)
                        .on("click", function(event) {
                                                                    alert(function(value){return value;}(i));
                                                              }
                             )
    });
    Je pensais que ce que j'avais écrit dans mon alert était une closure, qui aurait du me figer la valeur de i au moment de la création des objets, et non de l'execution de l'évenement...

    Or, si j'exécute ce code, quelque soit l'élément sur lequel je click, il me m'affiche toujours la même valeur qui correspond au nombre d'élément. J'en déduit donc que ce que j'ai fait n'est pas une closure et qu'il m'affiche la valeur de i au moment du déclenchement de l'évenement, donc lorsque qu'il est sorti de la boucle depuis bien longtemps...

    Je ne comprend donc pas... Comment aurais-je du m'y prendre pour créer une closure avec une fonction anonyme ?

    En vous remerciant !

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Je viens d'auto-trouver la solution, en utilisant la même technique, mais sur la fonction parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [...].on("click", function(i) {
    				return function(){alert(i);}
    				} (i));

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Il faut utiliser les attributs data-*, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $( function(){ // forme abrégée de $(document).ready(function(){
     
        var datas = [ "un", "deux", "trois" ],
            jObjParent = $( "article:first" );
     
        $.each( datas, function( i, item ){
     
            $( "<div/>", {
                "text" : item,
                "data-n" : i + 1,
                "click" : function(){
                    alert( $( this ).data( "n" ) );
                }
            }).appendTo( jObjParent );
     
        });
     
    });

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Est-ce qu'utiliser les data apporte vraiment quelque chose par rapport à la closure ?

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    L'utilisation de la méthode data() est éprouvée, elle est apparue avec la version 1.2.3, voir : http://api.jquery.com/data/.

    Au niveau du fonctionnement, de la lourdeur et de la gestion du code, il n'y a ici aucun avantage à utiliser une clôture.

    Souvent les développeurs n'utilisent qu'une fraction de l'API, je crois qu'ils se compliquent la vie en négligeant le meilleur des possibilités de jQuery.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/01/2015, 11h48
  2. Fonction avec 4 paramètres, c'est possible ?
    Par arnaudperfect dans le forum Langage
    Réponses: 2
    Dernier message: 18/06/2007, 09h31
  3. Réponses: 3
    Dernier message: 16/06/2004, 11h26
  4. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57

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