[JS] Portée d'une variable, comprends pas

Portée d'une variable, comprends pas [JS] - HTML/CSS - Programmation

Marsh Posté le 11-08-2011 à 11:21:06    

Bonjour à tous,
 
Je n'ai jamais eu l'occasion  de programmer vraiment en JS et du coup mes connaissances sont un peu limitées. Je suis face à un problème pour récupérer une valeur pour une mise en place de l'API google MAPS.
Voici la fonction en question :

Code :
  1. function newmarker (address) {
  2. var image = 'monimage.png';
  3. test = geocoder.geocode ({'address': address}, function(results, status) {
  4. if (status == google.maps.GeocoderStatus.OK) {
  5.  var latlong = results[0].geometry.location;
  6.  var marker = new google.maps.Marker({
  7.   map: map,
  8.   position: latlong,
  9.   icon: image
  10.  });
  11.  alert (latlong);
  12.  return latlong;
  13.   }
  14. });
  15. alert (test);
  16. }


Mon premier alert (latlong) renvoie bien la valeur que je souhaite. Donc je fais un return.
Je pensais que ma variable test prendrai cette valeur, mais ça n'est pas le cas.
En même temps ça ne m’étonne qu'à moitié car la fonction geocode a une fonction comme argument ???
J'avoue que je suis perdu, mon but étant que mon alert (test) renvoie la valeur de latlong
 
Je vous remercie sincèrement pour une éventuelle aide, je suis bien paumé. :jap:  :hello:

Reply

Marsh Posté le 11-08-2011 à 11:21:06   

Reply

Marsh Posté le 11-08-2011 à 11:30:35    

Ce n'est pas une question de portee. L'appel a geocoder que tu mets dans test va appeler ta fonction en parametre mais va retourner ce que l'appli google maps a prevu. Tu peux si tu ne veux pas te pencher sur l'api, utiliser (salement j'en conviens) une var globale et ca devrait fonctionner.

Code :
  1. var gLatLong;
  2. function newmarker (address) {
  3. var image = 'monimage.png';
  4. test = geocoder.geocode ({'address': address}, function(results, status) {
  5. if (status == google.maps.GeocoderStatus.OK) {
  6. gLatLong = results[0].geometry.location;
  7. var marker = new google.maps.Marker({
  8.  map: map,
  9.  position: latlong,
  10.  icon: image
  11. });
  12. alert (gLatLong);
  13.   }
  14. });
  15. alert (gLatLong);
  16. }


Si tu veux faire plus propre, il faut que tu te plonge serieusement dans l'API google.
 
[edit] ne pas prendre le code pour argent comptant, j'ai oublie de renomer un latlong en gLatLong, je te laisse le soin de voir ou [/edit]


Message édité par fred777888999 le 11-08-2011 à 11:33:51
Reply

Marsh Posté le 11-08-2011 à 12:04:24    

Merci oui j'ai corrigé et puis ne pas mettre var gLatLong; mais gLatLong pour une portée globale.
Alors ça marche sans marcher. Imcompréhensible, regardez voilà le code complet

Code :
  1. latitudelongitude = false;
  2. window.addEvent ("domready", function ()
  3. {
  4. initialize();
  5. });
  6. function initialize() {
  7. geocoder = new google.maps.Geocoder();
  8. var latlng = new google.maps.LatLng(48.866667, 2.333333);
  9. var myOptions = {
  10.   zoom: 5,
  11.   center: latlng,
  12.   mapTypeId: google.maps.MapTypeId.ROADMAP
  13. }
  14. map = new google.maps.Map(document.getElementById("map_canvas" ), myOptions);
  15. //--------------------------------------------------------------------------
  16. var tablo = $$('#liste_btq div h2');
  17. i=0;
  18. tablo.each(function(item, index) {
  19.  inputname = 'adresse_'+i;
  20.  myadresse = $(inputname).get('value');
  21.  newmarker (myadresse);
  22.  alert (latitudelongitude);
  23.  i=i+1;
  24. });
  25. //--------------------------------------------------------------------------
  26. }
  27. function newmarker (address) {
  28. var image = 'monimage.png';
  29. geocoder.geocode( {'address': address}, function(results, status) {
  30. if (status == google.maps.GeocoderStatus.OK) {
  31.  //map.setCenter(results[0].geometry.location);
  32.  latlong = results[0].geometry.location;
  33.  var marker = new google.maps.Marker({
  34.   map: map,
  35.   position: latlong,
  36.   icon: image
  37.  });
  38.  latitudelongitude = latlong;
  39.  alert (latitudelongitude);
  40.   }
  41. });
  42. }


 
Il y a donc 2 alert sur latitudelongitude; et bien par la volonté de saint esprit latitudelongitude de la ligne 22 reste à false pendant 3 ou 4 passages de la boucle. Et après il prend bien la valeur de latlong. Je précise que quand à lui latitudelongitude de la ligne 39 a la bonne valeur sur les 3 ou 4 premiers passages, ce qui là dépasse pour moi l'entendement  :heink:  
 
En tout cas merci d'or et déjà pour ton aide


Message édité par Scarf3ss3 le 11-08-2011 à 12:07:01
Reply

Marsh Posté le 11-08-2011 à 15:41:14    

Ce n'est pas forcement magique. Tu passe une fonction en parametre a l'api google. Cette derniere va probablement l'appeler au moment qu'elle jugera opportun, ce qui n'as pas forcement grand chose a voir avec celui ou tu appele l'API :(
En fait, que cherches-tu a faire (a peu pres) ?

Reply

Marsh Posté le 11-08-2011 à 16:56:44    

Je revenais pour dire que j'avais résolu ce souci. Pas d'erreur on va dire, c'est exactement ce que tu dis. La réponse met du temps donc du coup le script court toujours ce qui créé ce genre de soucis. On n'a pas ce genre de soucis avec le php ;)
J'ai donc mis une condition qui vérifie qu'il y a bien toute les réponses avant de continuer.
 
Si jamais ça interesse voici le script qui fonctionne.
 

Code :
  1. latlong = new Array ();
  2. bounds = new google.maps.LatLngBounds();
  3. window.addEvent ("domready", function ()
  4. {
  5. initialize();
  6. });
  7. function initialize() {
  8. geocoder = new google.maps.Geocoder();
  9. var myOptions = { mapTypeId: google.maps.MapTypeId.ROADMAP};
  10. map = new google.maps.Map(document.getElementById("map_canvas" ), myOptions);
  11. var tablo = $$('#liste_btq div h2');
  12. var i = 0;
  13. var nbr = tablo.length;
  14. tablo.each(function(item, index) {
  15.  inputname = 'adresse_'+i;
  16.  myadresse = $(inputname).get('value');
  17.  newmarker (myadresse, nbr, i);
  18.  i++;
  19. });
  20. }
  21. function newmarker (address, nbr, i) {
  22. var image = 'monimage.png';
  23. geocoder.geocode( {'address': address}, function(results, status) {
  24. latlong[i] = false
  25. if (status == google.maps.GeocoderStatus.OK) {
  26.  latlong[i] = results[0].geometry.location;
  27.  var marker = new google.maps.Marker({
  28.   map: map,
  29.   position: results[0].geometry.location,
  30.   icon: image
  31.  });
  32.  if (latlong.length == nbr) {
  33.   lasuite ();
  34.  }
  35.   }
  36. });
  37. }
  38. function lasuite () {
  39. for (var i = 0; i < latlong.length; i++) {
  40.  // ON NE PREND QUE LES ADRESSES IDENTIFIEES
  41.  if (latlong[i]) {
  42.   bounds.extend(latlong[i]);
  43.  }
  44. }
  45. map.fitBounds(bounds);
  46. }


 
Le truc c'est que j'utilise des adresses postales pour placer des markers en utilisant la méthode geocode de l'API
Je voulais qu'il me retourne les latitudes et longitudes trouvées.
J'en ai besoin pour prendre les valeurs max, en vue d'utiliser la méthode fitBounds de l'API qui centre la carte avec le bon zoom automatiquement.
Voilà, merci encore !  :jap:


Message édité par Scarf3ss3 le 11-08-2011 à 16:57:44
Reply

Marsh Posté le 14-08-2011 à 19:55:00    

Il va falloir que tu apprennes à coder en ASYCHRONE :o


---------------
Blablaté par Harko
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed