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 :

ça ne marche qu'avec la fonction alert()


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Par défaut ça ne marche qu'avec la fonction alert()
    Bonjour,

    j'ai un petit probleme avec ma boucle javascript,
    seulement le dernier résultat s'affiche, sauf si j'utilise "alert();" a chaque iteration.

    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
     
    var i=0;
    		var total ="";
    		var res = "";
    		res = data.split('/');
    		var length = res.length;
    		for(i=0;i<length-1;i++){
     
    			if (i%6==0){
     
    				alert(i);                          //ici
    				var vilA = ""+res[i]+"";
    				var vilB = ""+res[i+1]+"";
    				var latA = res[i+2];
    				var longA = res[i+3];
    				var latB = res[i+4];
    				var longB = res[i+5];
     
    				var map;
    				var directionsPanel;
    				var directions;
    				map = new GMap2(document.getElementById("map_canvas"));
    				map.addControl(new GLargeMapControl3D());
    				map.addControl(new GMapTypeControl());
    				map.setCenter(new GLatLng(47.082999, 2.395692), 6);
    				directionsPanel = document.getElementById("map_directions");
    				directions = new GDirections(map, directionsPanel);
    				directions.load("from: "+latA+", "+longA+" to: "+latB+", "+longB);
    				GEvent.addListener(directions,"load", function() {
    					var distance = directions.getDistance().meters;
    					distance=Math.floor(distance/1000);
    					var duree = directions.getDuration().seconds;
    					var heures=Math.floor(duree/3600);
    					var minutes=(duree/60)-(heures*60);
    					minutes=Math.floor(minutes);
    					total = total+""+vilA+" -> "+vilB+" distance : "+distance+"km"+" duree : "+heures+"h"+minutes+"min"+"<br />";
    					document.getElementById(""+divEcriture+"").innerHTML= total;
    				});
    			}
     
    		}
    Je suppose que la fonction alert() laisse le temps aux calculs de s'effectuer et que donc il faut que j'utilise quelque chose comme setTimeout mais dans mon cas je n'arrive pas à l'appliquer.

    Est ce que quelqu'un peut m'aider ? merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    si je ne m'abuse, durant toute ta boucle tu écris le résultat au même endroit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("" + divEcriture + "").innerHTML = total;
    mais que vaut divEcriture ?

    essaies de mettre un appel à une fonction de mise à jour des infos, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function addInfo( info){
      var oDiv = document.getElementById("div_info");
      oDiv.innerHTML += info;
    }
    que tu appelles dans ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GEvent.addListener(directions, "load", function () {
      var distance = directions.getDistance().meters;
      distance = Math.floor(distance / 1000);
      var duree = directions.getDuration().seconds;
      var heures = Math.floor(duree / 3600);
      var minutes = (duree / 60) - (heures * 60);
      minutes = Math.floor(minutes);
      addInfo( vilA + " -> " + vilB + " distance : " + distance + "km" + " duree : " + heures + "h" + minutes + "min" + "<br />");
    });

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Par défaut
    Bonjour,

    merci pour votre reponse.

    Je viens de tester cette solution mais ça ne marche pas, je n'ai toujours que le dernier element de ma boucle qui s'affiche dans mon div.

    edit : a chaque tour de boucle le contenu du div n'est pas écrasé, c'est comme si la fonction n'avait pas le temps de s'exécuter à part au dernier tour de boucle.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    je n'avions pas vu que tu utilisais vilA et vilB qui au moment de la "réalisation" de la fonction mise en callback dans GEvent.addListener vaudront effectivement les valeurs affectées en fin de boucle.
    Il te faut les passer en argument à la fonction pour avoir les bonnes valeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GEvent.addListener(directions, "load", function ( vilA, vilB) {

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Par défaut
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    function addInfo(info){
      var oDiv = document.getElementById("trajets");
      oDiv.innerHTML += info;
    }
     
     
    function ajoutSuccessif(inVilleDep,inVilleArr,inVillesArret,divEcriture) {
     
    	idVilleDep = document.getElementById(""+inVilleDep+"").value;
    	idVilleArr = document.getElementById(""+inVilleArr+"").value;
    	idVillesArret = document.getElementById(""+inVillesArret+"").value;
     
    	$.post("repAjout.php", {idVDep: ""+idVilleDep+"", idVArr: ""+idVilleArr+"", idVarrets: ""+idVillesArret+"", div: ""+divEcriture+""}, function(data){
     
    		var i=0;
    		var total ="";
    		var traj ="";
    		var sommeduree=0;
    		var sommedistance=0;
    		var res = "";
    		res = data.split('/');
    		var length = res.length;
     
     
    		for(i=0;i<length-1;i++){   //pour chaque element de mon tableau 'res'
     
    			if (i%6==0){   //si 'i' vaut 0,6,12... alors.. 
     
                                    //alert(i);     <--     avec ça, ça marche bien..
    				var vilA = ""+res[i]+"";
    				var vilB = ""+res[i+1]+"";
    				var latA = res[i+2];
    				var longA = res[i+3];
    				var latB = res[i+4];
    				var longB = res[i+5];
     
    				var map;
    				var directionsPanel;
    				var directions;
    				map = new GMap2(document.getElementById("map_canvas"));
    				map.addControl(new GLargeMapControl3D());
    				map.addControl(new GMapTypeControl());
    				map.setCenter(new GLatLng(47.082999, 2.395692), 6);
    				directionsPanel = document.getElementById("map_directions");
    				directions = new GDirections(map, directionsPanel);
    				directions.load("from: "+latA+", "+longA+" to: "+latB+", "+longB);
    				GEvent.addListener(directions,"load", function(vilA,vilB) {
    					var distance = directions.getDistance().meters;
    					distance=Math.floor(distance/1000);
    					var duree = directions.getDuration().seconds;
    					var heures=Math.floor(duree/3600);
    					var minutes=(duree/60)-(heures*60);
    					minutes=Math.floor(minutes);
     
     
    					addInfo( vilA + " -> " + vilB + " distance : " + distance + "km" + " duree : " + heures + "h" + minutes + "min" + "<br />");
     
    				});
     
    			}
     
    		}
     
    	});
    }
    Je n'ai toujours que la derniere ligne, et maintenant j'ai ca :
    "[object Object] -> undefined distance : 33km duree : 0h31min"

    au lieu de ca :

    "brest -> lyon distance : 33km duree : 0h31min"

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Citation Envoyé par alex7532 Voir le message
    Je n'ai toujours que la derniere ligne, et maintenant j'ai ca :
    "[object Object] -> undefined distance : 33km duree : 0h31min"

    au lieu de ca :

    "brest -> lyon distance : 33km duree : 0h31min"
    <humour>
    je connaissais la rue de brest à lyon mais d'ici aller en bretagne en 31 mn c'est de chez top
    </humour>
    C'est déjà bien tu récupères déjà quelque chose !
    es tu sûr de tes datas, la forme, la récupération

    Maintenant autre chose concernant ta fonction
    est-il normal de réaliser plusieurs fois la même chose avec les même données, exemple
    directions = new GDirections(map, directionsPanel);
    ne te faudrait-il pas passer également par un tableau...?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      direct[i/6] = new GDirections(map, directionsPanel);
      direct[i/6].load("from: " + latA + ", " + longA + " to: " + latB + ", " + longB);
      GEvent.addListener(direc[i/6], "load", function (vilA, vilB) {
      ... la suite
    avec bien sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var direct = []; // declaration tableau
    for (i = 0; i < length - 1; i++) { 
    ... la suite
    à voir la possibilité de sortir de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      map = new GMap2(document.getElementById("map_canvas"));
      map.addControl(new GLargeMapControl3D());
      map.addControl(new GMapTypeControl());
      map.setCenter(new GLatLng(47.082999, 2.395692), 6);
      directionsPanel = document.getElementById("map_directions");
    voila difficile d'en dire plus je ne connais pas l'API GoogleMap

    Peut être une page en ligne pour voir le global...

Discussions similaires

  1. UTF8-Encode ne marche pas avec la fonction "Filter"
    Par messahel dans le forum Bases de données
    Réponses: 8
    Dernier message: 17/10/2011, 10h57
  2. [PHP 5.3] Fonction str_replace qui ne marche pas avec '<br/>' ?
    Par [ZiP] dans le forum Langage
    Réponses: 1
    Dernier message: 28/02/2010, 18h27
  3. fonction js qui ne marche qu'avec un alert() dedans..
    Par skyangel20 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/10/2007, 16h30
  4. fonction alert(); avec choix oui/non
    Par Emcy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/08/2007, 08h35
  5. requete SQl avec la fonction max () qui ne marche pas
    Par eclipse012 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 14h32

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