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 :

Parametre fonction .bind()


Sujet :

jQuery

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 53
    Par défaut Parametre fonction .bind()
    Bonjour à tous.
    Je cherche à ajouter des évènements clic sur une image me permettant de cacher ou dérouler des groupes dans mon interface.
    Le soucis est que lorsque j'apelle la fonction $("#showHide_" + i).bind("click", function() {...}, lorsque le clic est executé la valeur de i prise est 4.
    Ce qui fait que je me retrouve à ne pouvoir dérouler que le dernier groupe quand je clic sur n'importe quel groupe.

    Est-il possible de passer un paramètre a fonction qui serai le i en cours ?

    Merci d'avance.
    Je met mon code source afin que vous puissiez comprendre.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(i = 0; i <= 4; i++) {
         // Gestion des actions sur l'affichage des groupes
         $("#showHide_" + i).bind("click", function() {
         if ($(this).attr("src") == "images/fleche-bas.png") {  // Cas où le groupe est replié
              $(this).attr("src", "images/fleche-haut.png");  // On met les fleches vers le haut
         }
         else {
              $(this).attr("src", "images/fleche-bas.png");  // On met les fleches vers le bas
     
         }
         $("#tUTD_" + i + "_wrapper").slideToggle( "slow");
       });
    }

  2. #2
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Salut,

    Il y a plusieurs solution à ce problème:

    Tu peux créer une closure différente par passage de boucle
    en assignant à bind une fonction qui retourne une fonction interne.

    genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $("#showHide_" + i).bind(
      function(v) { 
        return function(event) {  ... v est visible ici ... };
      }(i); // appel immédiat + copie de i dans v pour chaque passage de boucle
    );
    Tu peux ajouter des infos dans l'objet jquery avec .data()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     $("#showHide_" + i).data('v', i).bind( function(event) {
      var v = $(this).data('v');
    });
    soit utiliser le paramètre eventData de bind, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(i = 0; i <= 4; i++) {
         // Gestion des actions sur l'affichage des groupes
         $("#showHide_" + i).bind("click", { v: i }, function(event) {
           ...
           $("#tUTD_" + event.data.v + "_wrapper").slideToggle( "slow");
       });
    }
    Ou encore récupérer i de l'attribut id puisqu'il y figure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      $("#showHide_" + i).bind("click", function(event) {
          var v = $(this).attr('id').split('_')[1]; // Attention type String ici
       });

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 53
    Par défaut
    En faites ce que je fais est la dernière proposition en découpant la chaine mais cela ne me paraissait pas très propre.
    Je vais tester les autres solutions.
    Merci bien.

    [Edit]

    J'ai finalement opter pour la version 3 qui marche très bien.

    Encore merci

  4. #4
    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 : 74
    Localisation : Belgique

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

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

    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
    19
    20
    21
    /*
     * la solution trois est élégante, mais coûteuse
     * création de quatre gestionnaires d'événement
     */ 
    for(i = 0; i <= 4; i++) {
    	$("#showHide_" + i).bind("click", {v: i}, function(event){
    		console.log(event.data.v);
     
    		// $("#tUTD_" + event.data.v + "_wrapper").slideToggle( "slow");
    	});
    }
     
    /*
     * on utilise slice, mais
     * un seul gestionnaire d'événement
     */
    $("[id^='showHide_']").bind("click", function(event){
    	console.log(event.target.id.slice(9));
     
    	// $("#tUTD_" + event.target.id.slice(9) + "_wrapper").slideToggle( "slow");
    });
    [Edit]
    Un moment de faiblesse, il y a toujours quatre gestionnaires d’évènement, voir ci-dessous.

    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.)

  5. #5
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Cette technique évite juste la boucle, mais il y a autant de gestionaires
    d'évènement.

    Il ne faut pas oublier que le selecteur jquery retourne une
    liste.

    Dans le premier cas on a une boucle qui fait 4 tours avec
    un selecteur qui retourne une liste de 1 élément.

    Dans le deuxième cas on a pas de boucle, mais un sélecteur
    qui retourne une liste de 4 éléments, bind sera appelé aussi
    4 fois.

    Il faudrait utiliser live pour n'avoir qu'un seul gestionnaire d'évènement.

  6. #6
    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 : 74
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Oui !

    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. Problème parametre fonction DLL VC++
    Par lio33 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/06/2007, 14h01
  2. Parametre Fonction falcultatif
    Par hugo69 dans le forum VBA Access
    Réponses: 4
    Dernier message: 31/05/2007, 16h15
  3. socket : fonction bind
    Par hammag dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 21/11/2006, 20h09
  4. [C++] La fonction bind
    Par cfrelet dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 19/05/2006, 17h18
  5. [SOCKET] Fonction bind()
    Par chacal dans le forum Développement
    Réponses: 13
    Dernier message: 19/12/2005, 14h22

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