 
 
  |  | auteur : NoSmoking |  
Pour créer une InfoWindow, il faut utiliser le constructeur 
google.maps.InfoWindow.
Ce constructeur prend, ou non, en paramètre un objet contenant les options à affecter à l'InfoWindow :
  
Exemple #1 :
   
  var oInfo = new google.maps.InfoWindow();
  |  
 
 
Exemple #2 :
   
  var oInfo = new google.maps.InfoWindow({
    'position' : new google.maps.LatLng( 46.80, 1.70),           
    'content'  : 'Le centre de la <b>FRANCE</b> n\'est pas loin !'
  });
  |  
   | 
		Ne pas mettre de virgule après la dernière déclaration de propriété. 	
		 |  
 
Les options suivantes peuvent être initialisées à la création d'une InfoWindow : 
 
 
	- content (string|Node)
 Contenu devant être affiché dans l'InfoWindow ; 
	- disableAutoPan (boolean)
 Autorise ou non l'InfoWindow à être visible entièrement lors de son affichage. La valeur par défaut est false, ce qui veut dire que l'InfoWindow est affichée entièrement ; 
	- maxWidth (number)
 Largeur maximale de l'InfoWindow. La valeur par défaut dépend du contenu à afficher ; 
	- pixelOffset (Size)
 Décalage en pixels par rapport à la position, en latitude/longitude, prévue dans l'option position ; 
	- position (LatLng)
 Position d'affichage de l'InfoWindow, en tenant compte de l'option pixelOffset éventuelle ; 
	- zIndex (number)
 Ordre d'affichage de l'InfoWindow, l'empilement en quelque sorte. Une InfoWindow avec un zIndex élevé sera affichée par-dessus celle qui possède un zIndex plus faible. 
  |  
  |  | auteur : NoSmoking |  
Pour une fois la réponse est simple : on ne peut pas. Sauf en allant triturer le DOM.
 Il faut, dans ce cas, passer par une InfoWindow customisée 
via le constructeur google.maps.OverlayView. 
 
  |  
  |  | auteur : NoSmoking |  
Problème : 
Lorsque l'on clique sur un marker, l'InfoWindow 
s'affiche toujours sur le dernier marker créé, affichant les positions 
correctes du marker cliqué.
  
Considérons le code suivant où nous créons une carte à laquelle nous associons 
quatre markers.
Sur ces markers, nous ajoutons un événement lors du clic 
afin d'afficher la position, latitude et longitude, du marker cliqué 
dans une InfoWindow :
 function initCarte(){
  var tMarker = [
    { 'lat' :45.767299, 'lon' : 4.834329, 'title' :'Lyon'},
    { 'lat' :48.856667, 'lon' : 2.350987, 'title' :'Paris'},
    { 'lat' :44.837368, 'lon' :-0.576144, 'title' :'Bordeaux'},
    { 'lat' :43.297612, 'lon' : 5.381042, 'title' :'Marseille'}
  ];
  var oMap, oMarker, oInfo;
  var i, nb = tMarker.length;
  
  oMap = new google.maps.Map( document.getElementById( 'div_carte'),{
    'center' : new google.maps.LatLng( 46.80, 1.70),
    'zoom' : 6,
    'mapTypeId' : google.maps.MapTypeId.ROADMAP
  });
  
  oInfo = new google.maps.InfoWindow();
  
  for( i = 0; i < nb; i++){
    oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    google.maps.event.addListener( oMarker, 'click', function( data){
      
      oInfo.setContent( 'position' :<br>' +data.latLng.toUrlValue(5));
      oInfo.open( oMap, oMarker);
    });
  }
}
google.maps.event.addDomListener(window, 'load', initCarte);
  |  
 
 
Explication : 
Au moment de l'exécution de la fonction, la variable oMarker 
a pour référence le dernier marker initialisé. 
 
  
Solution : 
- Pour remédier à ce problème, il nous faut utiliser le mot-clé this 
dans le corps de la fonction mise sur l'événement. 
- Dans la fonction le this représente l'objet sur lequel s'est 
déclenché l'événement. 
- De la même manière, on n'utilisera pas la variable oMap, 
mais on récupérera via la méthode getMap() la map 
associée au marker. 
   
  google.maps.event.addListener( oMarker, 'click', function( data){
    
    oInfo.setContent( 'position' :<br>' +data.latLng.toUrlValue(5));
    oInfo.open( this.getMap(), this);
  }); 
  |  
 
 
Conclusion : 
Dans une "fonction événementielle", il est préférable d'utiliser le mot-clé 
this pour faire référence à l'objet en cours. 
 
  |  
  |  | auteur : NoSmoking |  
Problème : 
Lorsque je crée plusieurs markers dans une boucle avec une seule 
InfoWindow rien ne s'affiche quand je clique sur le marker.
  
Considérons le code suivant où nous créons une carte à laquelle nous associons 
quatre markers.
Sur ces markers, nous ajoutons un événement lors du clic 
afin d'afficher une InfoWindow avec une info propre à chaque marker :
 function initCarte(){
  var tMarker = [
    { 'lat' :45.767299, 'lon' : 4.834329, 'title' :'Lyon',      'info' :'<b>Lyon<\/b><br>la suite du texte...'},
    { 'lat' :48.856667, 'lon' : 2.350987, 'title' :'Paris',     'info' :'<b>Paris<\/b><br>la suite du texte...'},
    { 'lat' :44.837368, 'lon' :-0.576144, 'title' :'Bordeaux',  'info' :'<b>Bordeaux<\/b><br>la suite du texte...'},
    { 'lat' :43.297612, 'lon' : 5.381042, 'title' :'Marseille', 'info' :'<b>Marseille<\/b><br>la suite du texte...'}
  ];
  var oMap, oMarker, oInfo;
  var i, nb = tMarker.length;
  
  oMap = new google.maps.Map(document.getElementById("div_carte"),{
    'zoom' : 6,
    'center' : new google.maps.LatLng( 46.80, 1.75),
    'mapTypeId' : google.maps.MapTypeId.ROADMAP
  });
  
  oInfo = new google.maps.InfoWindow();
  
  for( i = 0; i < nb; i++){
    
    oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    google.maps.event.addListener( oMarker, 'click', function() {
      
      oInfo.setContent( tMarker[i].info);
      
      oInfo.open( this.getMap(), this);
    });
  }
}
google.maps.event.addDomListener(window, 'load', initCarte);
  |  
 
 
Explication : 
Au moment de l'exécution de la fonction et de l'affectation du contenu à 
l'InfoWindow, la variable i vaut nb, 
soit 4 dans le cas ci-dessus, et comme tMarker[4] est indéfini 
cela entraîne une erreur.
  
Pour remédier à ce problème il existe plusieurs méthodes.
  
Méthode #1 : surcharger l'objet oMarker en initialisant 
une variable, numero, à la 
création du marker :
   
  for( i = 0; i < nb; i++){
    
    oMarker = new google.maps.Marker({
      'numero' : i,           
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    google.maps.event.addListener( oMarker, 'click', function() {
      
      oInfo.setContent( tMarker[this.numero].info);
      
      oInfo.open( this.getMap(), this);
    });
  }
  |  
 
 
Méthode #2 : passer par une fonction externe à la boucle : 
 
function setEventMarker( marker, infowindow, texte){
  google.maps.event.addListener( marker, 'click', function() {
    
    infowindow.setContent( texte);
    
    infowindow.open( this.getMap(), this);
  });
}
  |  
 
... que l'on appellera dans la boucle de la façon suivante :
   
  for( i = 0; i < nb; i++){
    oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    setEventMarker( oMarker, oInfo, tMarker[i].info);
  }
  |  
 
 
Méthode #3 : encapsuler le tout dans une fonction anonyme, réalisation d'une 
closure, à laquelle on passe en paramètre les données à afficher : 
   
  for( i = 0; i < nb; i++){
    oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    (function( texte){
      google.maps.event.addListener( oMarker, 'click', function() {
        
        oInfo.setContent( texte);
        
        oInfo.open( this.getMap(), this);
      });
    })(tMarker[i].info);
  }
  |  
  |  
  |  | auteur : NoSmoking |  
Problème : 
Lorsque je crée plusieurs markers dans une boucle avec une seule 
InfoWindow, j'obtiens toujours l'affichage du même contenu quand 
je clique sur le marker.
  
Considérons le code suivant où nous créons une carte à laquelle nous associons 
quatre markers.
Sur ces markers, nous ajoutons un événement lors du clic 
afin d'afficher une InfoWindow avec une info propre à chaque marker :
 function initCarte(){
  var tMarker = [
    { 'lat' :45.767299, 'lon' : 4.834329, 'title' :'Lyon',      'info' :'<b>Lyon<\/b><br>la suite du texte...'},
    { 'lat' :48.856667, 'lon' : 2.350987, 'title' :'Paris',     'info' :'<b>Paris<\/b><br>la suite du texte...'},
    { 'lat' :44.837368, 'lon' :-0.576144, 'title' :'Bordeaux',  'info' :'<b>Bordeaux<\/b><br>la suite du texte...'},
    { 'lat' :43.297612, 'lon' : 5.381042, 'title' :'Marseille', 'info' :'<b>Marseille<\/b><br>la suite du texte...'}
  ];
  var oMap, i, nb = tMarker.length;
  
  oMap = new google.maps.Map(document.getElementById("div_carte"),{
    'zoom' : 6,
    'center' : new google.maps.LatLng( 46.80, 1.75),
    'mapTypeId' : google.maps.MapTypeId.ROADMAP
  });
  
  for( i = 0; i < nb; i++){
    
    var oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    var oInfo = new google.maps.InfoWindow({
      'content' : tMarker[i].info
    });
    
    google.maps.event.addListener( oMarker, 'click', function() {
      
      oInfo.open( this.getMap(), this);
    });
  }
}
google.maps.event.addDomListener(window, 'load', initCarte);
  |  
 
  |  
  |  | auteur : NoSmoking |  
Les InfoWindows sont affichées sur la carte suivant leur latitude, 
celles ayant les plus petites latitudes étant affichées au-dessus de celles ayant 
une latitude plus grande. En d'autres termes, celles qui sont en bas de l'écran 
sont affichées au-dessus de celles qui sont en haut de l'écran. 
Dans le cas où deux InfoWindows posséderaient la même latitude, 
c'est l'ordre d'affichage qui est pris en compte. La première affichée passera 
en dessous de la deuxième affichée et ainsi de suite.
  
Pour gérer l'ordre d'affichage, il suffit d'utiliser la méthode setZIndex() 
de l'objet google.maps.InfoWindow en passant en paramètre la 
valeur du zIndex souhaitée.
  oInfo.setZIndex( valeur_zIndex);
  |  
 
 
On peut également utiliser la méthode setOptions(). Dans ce cas, 
on passe en paramètre l'objet sous sa forme littérale comme suit :
 oInfo.setOptions( {'zIndex' : valeur_zIndex});
  |  
 
 
Pour gérer cela, on va surcharger l'objet Map en initialisant 
une variable, zIndexBulle, à la création de la map :
   oMap = new google.maps.Map(document.getElementById("div_carte"),{
    'zIndexBulle' : 1,  
    'zoom' : 6,
    'center' : new google.maps.LatLng( 46.80, 1.75),
    'mapTypeId' : google.maps.MapTypeId.ROADMAP
  });
  |  
 
 
Ainsi lors de l'affichage, au clic sur le marker, il n'y aura plus 
qu'à incrémenter sa valeur et à l'affecter au zIndex de l'InfoWindow :
   google.maps.event.addListener( oMarker, 'click', function(){
    var map = this.getMap();           
    var index = map.zIndexBulle ++;    
    bulle.setZIndex( index);           
    bulle.open( map, this);            
  });
  |  
 
 
Le code complet d'utilisation donne :
 function initCarte(){
  var tMarker = [
    { 'lat' :45.782129, 'lon' : 3.095521,
      'title' :'Clermont-Ferrand', 'info' :'<b>Clermont-Ferrand<\/b><br>la suite du texte...'},
    { 'lat' :45.438392, 'lon' : 4.388131,
      'title' :'Saint Etienne', 'info' :'<b>Saint Etienne<\/b><br>la suite du texte...'},
    { 'lat' :45.767299, 'lon' : 4.834329,
      'title' :'Lyon', 'info' :'<b>Lyon<\/b><br>la suite du texte...'},
    { 'lat' :45.192063, 'lon' : 5.720395,
      'title' :'Grenoble', 'info' :'<b>Grenoble<\/b><br>la suite du texte...'}
  ];
  var oMarker, oInfo, oMap, i, nb = tMarker.length;
  
  oMap = new google.maps.Map(document.getElementById("div_carte"),{
    'zIndexBulle' : 1,  
    'zoom' : 6,
    'center' : new google.maps.LatLng( 46.80, 1.75),
    'mapTypeId' : google.maps.MapTypeId.ROADMAP
  });
  
  for( i = 0; i < nb; i++){
    oMarker = new google.maps.Marker({
      'position' : new google.maps.LatLng( tMarker[i].lat, tMarker[i].lon),
      'map' : oMap,
      'title' : tMarker[i].title
    });
    
    oInfo = new google.maps.InfoWindow({
      'content' : tMarker[i].info
    });
    
    (function( bulle){
      google.maps.event.addListener( oMarker, 'click', function(){
        var map = this.getMap();           
        var index = map.zIndexBulle ++;    
        bulle.setZIndex( index);           
        bulle.open( map, this);            
      });
    })(oInfo);
  }
}
google.maps.event.addDomListener( window, 'load', initCarte);
  |  
 
  |  
 
 
 
						Consultez les autres F.A.Q.
					  		   
 
		
 | 
 |