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 :

aide sur return


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Par défaut aide sur return
    Bonjour à tous,

    Etant plus habitué à python j'apprend js pour utiliser l'api google map.

    Mais je n'arrive pas à faire un "return" et cela fait un moment que je cherche.

    Sauriez vous pourquoi pour le code suivant,
    Dans la fonction adress2latlng j'ai une une valeur pour latlng_local que je n’arrive pas à récupérer dans initialize ?

    Merci de votre aide

    Alex

    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
    36
    37
    38
    39
    40
    41
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
        src="http://maps.google.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
     
     
        function initialize() {
        var latlng_center=adress2latlng("paris,France");
        alert("dans initialize : "+latlng_center)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
                alert("dans adress2latlng "+address+" latlng "+latlng_local);
                return latlng_local;
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
     
    </script>
    </head>
    <body onload="initialize()">
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Bonsoir alexdevl,
    J'ai essayé les closures ,les variables globales ,j'ai même fais une classe
    et tout ce que je récupère c'est le code de la fonction et même le code de la méthode de google
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function (a, b) {
        S(Jd, function (c) {c.geocode(a, b);});
    }
    j'ai même créer une fonction à part
    rien n'y fait et c'est un probleme qui m'interesse une fonction dans une méthode d'objet j'ai eu le même soucis avec Prototype.
    c'est une super closure en gros
    qu'est que results ?
    il y aurait pas dans l'api un getter
    genre
    results.responseXXX??
    Bon courage
    EDIT results est un objet vide qui renvois object object et 0 et encore object object et 0 etc etc

  3. #3
    Membre éclairé Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Par défaut
    salut,
    une solution certes de folie, mais qui fonctionne
    - Extraire les coordonnées via une fonction dans un element caché
    - attendre que la valeur ait changé (synchro)
    ça donne
    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
    36
    37
    38
    39
    40
    <script type="text/javascript">
     
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (getHiddenValue()) alert('dans initialize : '+getHiddenValue()); setHiddenValue(''); clearInterval(timer);",500)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
    	    buffer = results[0].geometry.location;
    	    setHiddenValue(buffer);
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
    	function setHiddenValue(data) {
    		document.getElementById('txt').innerHTML = data;
    		}
    	function getHiddenValue() {
    		if (document.getElementById('txt').innerHTML=='') return false;
    		else return document.getElementById('txt').innerHTML;
    		}
     
     
    </script>
    </head>
    <body onload="initialize()">
      coucou
      <div id="map_canvas" style="width:100%; height:100%"></div>
      <div id="txt"></div>
      titi
    </body>
    </html>
    Mais doit y avoir plus simple !

  4. #4
    Membre éclairé Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Par défaut
    et les variables super globales alors (window[]) !
    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
    <script type="text/javascript">
     window['buffer']='';
     
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (window['buffer']!='') alert('dans initialize : '+window['buffer']); window['buffer']=''; clearInterval(timer);",500)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
    	    window['buffer'] = latlng_local;
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
     
     
    </script>
    </head>
    <body onload="initialize()">
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Merci ce n'est pas mon topic mais j'apprend quelque chose là
    pour la 1er solution j'y avais pensé et pour les variables super globale j'ignorais leurs existences
    A utiliser avec modération surement mais ça va me rendre service
    En gros c'est un passage de valeur par réference j'ignorais que c'etait possible en Js...

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 200
    Par défaut
    Bonjour, pour répondre à
    Citation Envoyé par alexdevl
    Sauriez vous pourquoi pour le code suivant,
    Dans la fonction adress2latlng j'ai une une valeur pour latlng_local que je n’arrive pas à récupérer dans initialize ?
    il faut bien te rendre compte que la function initialize appelles la fonction adress2latlng qui elle lance la fonction anonyme de ton geocoder, cette action est asynchrone, elle s'exécute mais rend la main, ce qui entraîne un retour dans la fonction initialize sans attendre le retour de cette action.
    en résumé voila ce qui se passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DEBUT function initialize()
    ----DEBUT function adress2latlng(address)
    ----FIN function adress2latlng(address)
    ----latlng_center = undefined
    FIN function initialize()
    DEBUT function (results, status)
    ----address = paris,France, latlng = (48.8566667, 2.3509870999999975)
    la source corrigée pour voir le principe, ne pas ce formaliser sur le code il n'est modifié que dans le but d'afficher la chronologie des appels
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var decal = -4;
    window.alert = function(txt){
      decal = txt.match('DEBUT') ? decal +4 : decal;
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal +4 : decal;
      document.getElementById('div_info').innerHTML += new Array( decal+1).join('-') +txt +'<br>';
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal -4 : decal;
      decal = txt.match('FIN')   ? decal -4 : decal;
    }
    function initialize(){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var latlng_center = adress2latlng("paris,France");
      alert("latlng_center = " + latlng_center)
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function adress2latlng(address){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
        if (status == google.maps.GeocoderStatus.OK){
          var latlng_local = results[0].geometry.location;
          alert("address = " + address + ", latlng = " + latlng_local);
          return latlng_local;
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
        alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
      });
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    </script>
    </head>
    <body onload="initialize()">
      <div id="div_info"></div>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    en gros ta valeur est retournée...dans le vide mais pas dans initialize

    Pour l'exploiter il te faut le faire à partir du corps de la fonction anonyme, ou de passer le résultat en paramètre à une fonction.
    Exemple dans le même style que le code ci dessus
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var decal = -4;
    window.alert = function(txt){
      decal = txt.match('DEBUT') ? decal +4 : decal;
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal +4 : decal;
      document.getElementById('div_info').innerHTML += new Array( decal+1).join('-') +txt +'<br>';
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal -4 : decal;
      decal = txt.match('FIN')   ? decal -4 : decal;
    }
    function centreMap( lat_lng){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      alert("latlng_center = " + lat_lng);
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function initialize(){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var latlng_center = adress2latlng("paris,France");
      alert("latlng_center = " + latlng_center)
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function adress2latlng(address){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
        if (status == google.maps.GeocoderStatus.OK){
          var latlng_local = results[0].geometry.location;
          centreMap( latlng_local);
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
        alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
      });
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    </script>
    </head>
    <body onload="initialize()">
      <div id="div_info"></div>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    le résultat sera dans ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DEBUT function initialize()
    ----DEBUT function adress2latlng(address)
    ----FIN function adress2latlng(address)
    ----latlng_center = undefined
    FIN function initialize()
    DEBUT function (results, status)
    ----DEBUT function centreMap( lat_lng)
    --------latlng_center = (48.8566667, 2.3509870999999975)
    ----FIN function centreMap( lat_lng)
    FIN function (results, status)
    Citation Envoyé par Billy KiT
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (window['buffer']!='') alert('dans initialize : '+window['buffer']); window['buffer']=''; clearInterval(timer);",500)
        }
    ...
    en réalité tu ne te trouves plus dans la fonction initialize, mais cela reste également une solution

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

Discussions similaires

  1. demande d'aide sur samba
    Par marcoss dans le forum Développement
    Réponses: 5
    Dernier message: 04/12/2003, 19h38
  2. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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