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 :

Argument d'une fonction onclick dans éléments créés en boucle


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Agriculteur
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Agriculteur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Argument d'une fonction onclick dans éléments créés en boucle
    Salut salut !

    Je bloque sur un souci, qui semble assez simple :

    Utilisant leaflet (API géo), je souhaite créer des zones intéractives,
    Sauf que chaque zone est créée en js, dans une boucle utilisant des données stockées dans un tableau.

    Je souhaite passer dans la fonction onclick un argument différent pour chaque zone (un peu normal il semble )
    J'ai essayé pas mal de choses, mais je bloque complet...
    Extrait de code

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    for (i = 0; i < NbParcelles; i++) 
                    {
                    //console.log('I '+i);
                    var CoordsString;
                    var nom = parcelles[i][0];// tableau [i][x], avec pourx : 0 = nom ; 1 = coordonnées (array)
                    var coords = parcelles[i][1];
                    //console.log ("coords " +coords);
    				//console.log ("coords{1] " +coords);
                    zone.lenght = i;
                    try {
                    zone[i]= L.polygon(coords,{
                            color: 'green',
                            weight: 10,
                            opacity: 0.7})
     
    						.addTo(map);
     
    //-----------C'est là que je n'arrive pas à trouver la bonne formule---------
    				zone[i].addEventListener(
    				"click",
    				function(){selectionner(nom)});
     
    				}// ne marche pas (lance la fonction avec le dernier "nom" de la boucle)
    				catch{"souci pour "+ nom}
     
                    } //fin for i  
     
     
     
    		 function selectionner(id_sel){
    		console.log("sélection : "+ id_selection);
    		document.getElementById("nom_selection")="Sélec    : <b>"+id_sel+"</b>";   
     
     	  }
    Merci d'avance pour votre aide !!

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 170
    Points
    17 170
    Par défaut
    Salut
    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
    22
    23
    24
    			for (i = 0; i < NbParcelles; i++) 
                    {
    					//console.log('I '+i);
    					var CoordsString;
    					var nom = parcelles[i][0];// tableau [i][x], avec pourx : 0 = nom ; 1 = coordonnées (array)
    					var coords = parcelles[i][1];
    					//console.log ("coords " +coords);
    					//console.log ("coords{1] " +coords);
    					zone.lenght = i;
    					try {
    							zone[i]= L.polygon(coords,{
    								color: 'green',
    								weight: 10,
    								opacity: 0.7})
    							.addTo(map).on('click', selectionner(nom));
    					}
    					catch{"souci pour "+ nom}
     
                    } //fin for i  
     
    			function selectionner(id_sel){
    				console.log("sélection : "+ id_selection);
    				document.getElementById("nom_selection")="Sélec    : <b>"+id_sel+"</b>";   
    			}
    il me semble.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre à l'essai
    Homme Profil pro
    Agriculteur
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Agriculteur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Salut Prog,

    Merci de ton aide !
    Alors là ça me fait un truc incompréhesible lors du test : la fameuse fonction "selectionner()" se lance lors de la création de la page pour TOUS les noms, puis zones incliquables

    Une idée ? Je fouille de mon côté
    Code testé
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
            var zone=new Array();
            var NbParcelles = parcelles.length;
            console.log('nb parcelles'+NbParcelles);
            for (i = 0; i < NbParcelles; i++) 
                    {
                    //console.log('I '+i);
                    var CoordsString;
                    var nom = parcelles[i][0];// tableau [i][x], avec pourx : 0 = nom ; 1 = coordonnées (array)
                    var coords = parcelles[i][1];
                    //console.log ("coords " +coords);
    				//console.log ("coords{1] " +coords);
                    zone.lenght = i;
                    try {
                    zone[i]= L.polygon(coords,{
                            color: 'green',
                            weight: 10,
                            opacity: 0.7})
     
    						.addTo(map)
    						.on('click', selectionner(nom));
     
    				}
    				catch{"souci pour "+ nom}
     
                    } //fin for i  
     
     
     
    		 function selectionner(id_sel){
    		console.log("sélection : "+id_sel);
    		document.getElementById('nom_selection').innerHTML="Sélec    : <b>"+id_sel+"</b>";   
    		 }

  4. #4
    Membre à l'essai
    Homme Profil pro
    Agriculteur
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Agriculteur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Résolu
    Euh pardon,
    Auto résolution developpez.com
    https://javascript.developpez.com/fa...lick.dynamique

    Je suis pas le premier à être planté
    Merci à la communauté !

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 170
    Points
    17 170
    Par défaut
    Re

    L'important étant que ton problème est résolut, il me semble bien que tu pouvais faire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    zone.push(L.polygon(coords,{
                            color: 'green',
                            weight: 10,
                            opacity: 0.7})
     
    						.addTo(map)
    						.on('click', selectionner(nom)));
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 112
    Points
    44 112
    Par défaut
    Bonjour,
    Citation Envoyé par ProgElecT
    il me semble bien que tu pouvais faire aussi
    en faisant de la sorte au moment de l'affectation sur l'événement onclick tu exécutes la fonction, remplace ta fonction selectionner(nom) par un console.log(nom) et regarde ce qui se passe dans la console.


    Citation Envoyé par Farmer64
    La faq est un peu ancienne et mériterait d'être mise à jour, mais je vois qu'elle est encore utille

    Concernant ton soucis tu peux régler cela d'une « manière plus moderne »

    Quelque chose comme, à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const zone = [];
    parcelles.forEach((parcelle) => {
      const nom = parcelle[0];
      const coords = parcelle[1];
      zone.push(L.polygon(coords, {
          color: 'green',
          weight: 10,
          opacity: 0.7
        })
        .on('click', () => {
          selectionner(nom)
        })
        .addTo(map));
    });

  7. #7
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 170
    Points
    17 170
    Par défaut
    Citation Envoyé par NoSmoking
    Bonjour,
    Citation Envoyé par ProgElecT
    il me semble bien que tu pouvais faire aussi
    en faisant de la sorte au moment de l'affectation sur l'événement onclick tu exécutes la fonction, remplace ta fonction selectionner(nom) par un console.log(nom) et regarde ce qui se passe dans la console.
    , a vrai dire j'ai repris une ligne de code perso
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    markerArray.push(L.marker(latlng1,{icon:DessIcon,title:TitleMarqueur,alt:QRZaff,riseOnHover:true}).on('click', onClickMarqueur).addTo(carte));
    Ben là il n'y a pas exécution de la fonction, la différence ... , la fonction affectée n'attend pas d'argument, et .... il n'y a pas d’exécution à chaque tour dans la boucle.
    Merci de l'information, j'ai encor appris quelque chose.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 112
    Points
    44 112
    Par défaut
    Ben là il n'y a pas exécution de la fonction, la différence ... ,
    et .... il n'y a pas d’exécution à chaque tour dans la boucle.
    dans ton cas tu passes la référence de la fonction à exécuter sur le clic, donc il n'y a pas de soucis, et c'est une bonne chose attendu que si tu as 1000 éléments à traiter cela t'évites de créer 1000 fonctions en mémoire.

    Dans la mesure où tu as besoin de passer des arguments, tu peux toujours « attacher » ces paramètres à l'objet à traiter, un peu dans l'esprit de ce que dit la faq, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    datas.forEach((data) => {
      L.marker(Object.values(data.position), {
          "data": data              // on stocke les données nécessaires
        })
        .on("click", actionSurClic) // on passe la référence de la foncion à exécuter
        .addTo(this.myMap)
    });
    il suffit d'avoir une fonction actionSurClic déclarée, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function actionSurClic(e) {
      const obj = e.target;                 // récup. de l'élément cliqué
      console.log("Objet cliqué :", obj);
    }
    et tu as accès à toutes les données contenues dans obj.data.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Agriculteur
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Agriculteur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Merci :-)
    Merci à tous pour les amendements !!
    Petite précision, j'avais bien trouvé le système function actionSurClic(e), mais pas utilisé car une question existentielle me bloquait (et doit sans doute en gêner plus d'1): A quoi correspond ce e qui est en argument ?
    ++

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 112
    Points
    44 112
    Par défaut
    A quoi correspond ce e qui est en argument ?
    l'argument e est l'argument passé à la fonction de rappel, le listener, c'est un objet Event, paramètre unique, qui contient toutes les informations sur l'événement venant de se produire.

    Il est souvent intéressant de placer un console.log(e) en entrée de fonction pour voir ce dont on dispose.

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

Discussions similaires

  1. [XL-2003] Probléme dans les arguments d'une fonction
    Par ClementZa dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/12/2010, 15h27
  2. Réponses: 1
    Dernier message: 01/04/2010, 14h49
  3. Réponses: 7
    Dernier message: 22/06/2008, 00h05
  4. Réponses: 11
    Dernier message: 18/02/2007, 15h37
  5. Une fonction javascript dans un évènement onClick
    Par Lomig dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2007, 21h52

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