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 :

[AJAX] passer un argument a une fonction de callback ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 54
    Par défaut [AJAX] passer un argument a une fonction de callback ?
    Bonjour a tous,

    j'essaie de récupérer des coordonnées gps de villes avec google map. Je me prend la tête sur un bête petit problème :
    gclient.getLatLng, qui renvoie des coordonées d'après une chaine prend en argument une chaine de caractère et une fonction callback a laquelle elle envoie un objet GLatLng.
    J'essaie de faire passer un indice de tableau en plus de cet objet mais pas moyen...
    Les coordonnées s'affichent bien avec le alert alert("insee:"+" "+latln.lat()+","+latln.lng());
    mais le alert(i); m'indique "undefined"
    Quelqu'un aurait-il une solution ?
    Merci...

    PS : j'avais déjà essayer avec juste test(latln, i) à la place de function(latln, i){alert(i);test(latln, i)}) comme callback.


    Voici le code en question :

    Code javascript : 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
    function gmap_sql(responseObject)
    {
    	chaine = new Array();
    	var gclient = new GClientGeocoder;
    	for(var i=0; typeof(responseObject[i]) !="undefined"; i++)
    	{
    	var loader = document.createElement('div');
        loader.innerHTML = responseObject[i].chaine+" "+responseObject[i].insee ;
    	chaine[i] = responseObject[i].chaine ;
    	insee[i] = responseObject[i].insee ;
     
    //########## ICI #########
    	gclient.getLatLng(chaine[i]+" "+insee[i],function(latln, i){alert(i);test(latln, i)});
     
        document.getElementById("cont").appendChild(loader);
    	}
    }
    //Callback
    function test(latln,i)
    {
     
    alert("insee:"+" "+latln.lat()+","+latln.lng());
     
    }

  2. #2
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Essaie ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var cb = function(_i)
    {
      return function(latln)
      {
        alert(_i)
        test(latln, _i);
      }
    }(i)
     
    gclient.getLatLng(chaine[i]+" "+insee[i],cb);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 54
    Par défaut
    merci d'avoir répondu mais ça ne fonctionne pas (les alert ne se déclenchent pas)...
    J'ai trouvé quelque chose qui marche presque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(var i=0; typeof(responseObject[i]) !="undefined"; i++)
    {
    ...
    gclient.getLatLng(chaine[i]+" "+insee[i],function(latln){
    			test(i,latln)});
    ...
    }
     
    function test(_i,latln)
    {
    alert(_i); 
    alert(latln.lat()+","+latln.lng());
    }
    Le gros problème, c'est que le alert(_i) m'affiche toujours le dernier indice du tableau. Je suppose que les fonctions callback sont stockées dans une pile d'appel et lorsque qu'elles démarrent la boucle for est déjà terminée donc i vaut le dernier indice...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 54
    Par défaut
    autrement i doit passer par référence et pas par valeur...
    quelqu'un peut-il m'aider ?

  5. #5
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Le gros problème, c'est que le alert(_i) m'affiche toujours le dernier indice du tableau. Je suppose que les fonctions callback sont stockées dans une pile d'appel et lorsque qu'elles démarrent la boucle for est déjà terminée donc i vaut le dernier indice...
    Normalement, la syntaxe que je t'ai donné résoud ce problème.
    Fais voir comment tu l'as retranscrite?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 54
    Par défaut
    ça à l'air de fonctionner de cette manière :
    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
    function gmap_sql(responseObject)
    {
     
    	var gclient = new GClientGeocoder;
    	for(var i=0; typeof(responseObject[i]) !="undefined"; i++)
    	{
    	var loader = document.createElement('div');
        loader.innerHTML = responseObject[i].chaine+" "+responseObject[i].insee ;
    	chaine = responseObject[i].chaine ;
    	insee = responseObject[i].insee ;
    	  document.getElementById("cont").appendChild(loader);
    	  gclient.getLatLng(chaine[i]+" "+insee[i],
    		function(_i)
    		 {
    		  return function(latln)
    		  {
    		    test(latln, _i);
    		  }
    		}(i)
    		);
      }
     
    }
    function test(latln, _i)
    {
    alert(_i);
    alert("insee:"+" "+latln.lat()+","+latln.lng());
    lat= latln.lat();
    lng = latln.lng();
    Merci beaucoup, maintenant yapluka (enfin, j'espère)... !

    Par contre, je débute avec ce genre d'utilisation de javascript et je ne comprend pas la syntaxe (pourquoi ne passe-t-on pas latln dans la function callback ?, l'histoire du return function, et le paramètre qu'on passe avec (i))...
    Si tu sais où trouver un tutoriel là dessus, je suis preneur.

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

Discussions similaires

  1. [AC-2010] Passer un argument recordset à une fonction
    Par gagpie dans le forum VBA Access
    Réponses: 4
    Dernier message: 28/01/2016, 13h44
  2. Passer un argument dans une fonction appelée depuis un onChange
    Par francky74 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/03/2015, 09h28
  3. Passer un argument a une fonction a traver URL
    Par sitirna dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/02/2009, 16h07
  4. Comment passer un argument dans une fonction
    Par DeezerD dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/01/2008, 18h13
  5. Réponses: 9
    Dernier message: 19/10/2006, 10h02

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