11548 sujets

JavaScript, DOM et API Web HTML5

Grace à l'API de Google Maps, je tente d'établir une carte de france comportant des marqueurs issus d'une table XML. Je constate que deux variables globales se perdent en traversant une fonction à l'intérieur de laquelle elles fonctionnent parfaitement.

Voici un code simplifié, en activant les alertes, on constate que les variables sont indéfinies lorsqu'on a besoin d'elles pour dérouler la liste.

Qui pourrait me sortir de là ?


<script type="text/javascript">	
combien = 0
nom = []

// Ajout de marqueurs à partir de base de donnée "data.xml"	sur le serveur
GDownloadUrl("http://michel.hillon.free.fr/test/data/data2.xml", 
function(data) {
	var xml = GXml.parse(data);	  
	var markers = xml.documentElement.getElementsByTagName("marker");
	combien = markers.length  	
 	for (var i = 0; i<combien; i++) {	 
		nom[i] =  markers[i].getAttribute("nom")  ;
	}	
	// alert(nom[3] + "\nNombre : " +combien)	// ici, c'est OK!	 
});  					 
// alert(nom[3] + "\nNombre : " +combien)		// ici, c'est undefined !
</script>
</head>
  
<body>
<h4>Liste des amis</h4>
	<script type="text/javascript">
	// alert(nom[3] + "\nNombre : " +combien)	 // ici, undefined !
	for (var i = 0; i<combien; i++)		{	
		document.write("<a id='A" + i + "' href='javascript:alert(this.id)'>" + 
nom[i]+"</a><br />");	 
	}	
	</script>

[/i][/i][/i]
Modifié par achem40 (29 May 2008 - 12:40)
C'est sans doute une question de namespace, Google a dû faire les choses proprement et donc "isoler" sa fonction GDownload. La variable "combien" à qu'elle manipule n'est donc pas ton "combien" "global".
Pour forcer l'utilisation du "combien" "global", il doit suffir de préfixer ta variable par "window." dans la fonction passée en paramètre :
...
window.combien = markers.length  	
for (var i = 0; i<window.combien; i++)
...
C'était une bonne hypothèse, une bonne piste ... hélas cela ne change rien et le mystère reste entier ..
en fait la liste apparait parfaitement lorsqu'on rafraichit l'explorateur, il y a donc un problème de timing, de synchronisation entre les deux script. Cela t'inspire-t-il une autre idée ?
Merci de ton aide
Modifié par achem40 (29 May 2008 - 12:45)
Arf, pas bête. Si l'appel dans GDownloadUrl est asynchrone, ta boucle "liste des amis" s'exécute alors que ta fonction qui parse n'a pas encore été appelée...

Dans ce cas, pourquoi ne pas faire ton traitement dans la fonction après avoir justement "parsé" ?

GDownloadUrl("http://michel.hillon.free.fr/test/data/data2.xml", 
  function(data) {
    var xml = GXml.parse(data);	  
    var markers = xml.documentElement.getElementsByTagName("marker");
    var combien = markers.length;

    var nom, html = "";
    for (var i=0; i<combien; i++) {
      nom = markers[ i].getAttribute("nom");
      html += "<a id='A"+i+"' href='javascript:alert(this.id)'>"+nom+"</a><br />";
    }	
    document.getElemebrById("divAmis").innerHTML = html;
  });

...

<h4>Liste des amis</h4>
<div id="divAmis">
chargement en cours...
</div>