| 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.
|
|