FAQ API Google MapsConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 31, dernière mise à jour : 23 février 2015
- Comment créer une InfoWindow ?
- Comment modifier le style d'une InfoWindow ?
- Pourquoi l'InfoWindow s'affiche sur le dernier marker créé ?
- Comment afficher une InfoWindow ?
- Pourquoi l'InfoWindow n'affiche rien quand je clique sur le marker ?
- Pourquoi l'InfoWindow n'affiche pas le bon contenu ?
- Comment afficher une InfoWindow au-dessus des autres ?
- Comment masquer une InfoWindow ?
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 :
//
création
d'une
infobulle
vide
en
attente
d'initialisation
var
oInfo =
new
google.
maps.
InfoWindow
(
);
Exemple #2 :
//
création
d'une
infobulle
en
attente
d'affichage
var
oInfo =
new
google.
maps.
InfoWindow
(
{
'
position
'
:
new
google.
maps.
LatLng
(
46
.
80
,
1
.
70
),
//
position
d'ancrage
de
l'InfoWondow
sur
la
carte
'
content
'
:
'
Le
centre
de
la
<b>FRANCE</b>
n\'est
pas
loin
!
'
//
contenu
qui
sera
affiché
}
);
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 la carte est déplacé pour que l'InfoWindow soit 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|LatLngLiteral)
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.
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.
Problème :
Lorsque je clique sur un marker, l'InfoWindow
s'affiche toujours sur le dernier marker créé, affichant pourtant 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;
//
création
de
la
carte
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
}
);
//
création
infobulle
oInfo =
new
google.
maps.
InfoWindow
(
);
//
création
des
markers
dans
une
boucle
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
}
);
//
événement
clic
sur
le
marker
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
data){
//
affichage
position
du
marker
oInfo.
setContent
(
'
position
:<br>
'
+
data.
latLng.
toUrlValue
(
5
));
oInfo.
open
(
oMap,
oMarker);
}
);
}
}
//
init
lorsque
la
page
est
chargée
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.
//
événement
clic
sur
le
marker
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
data){
//
affichage
position
du
marker
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.
L'affichage d'une InfoWindow peut se faire de plusieurs façons.
1/ A l'initialisation. Dans ce cas il suffit de spécifier les options suivantes :
- le content : c'est un minimum pour que cela serve à quelque chose ;
- la map : la carte sur laquelle sera affichée l'InfoWindow ;
- la position : l'endroit où sera affichée l'InfoWindow, la position doit être au format google.maps.LatLng ou au format google.maps.LatLngLiteral.
//
création
d'une
infobulle
et
affichage
var
oInfo =
new
google.
maps.
InfoWindow
(
{
'
content
'
:
'
Le
centre
de
la
FRANCE
n\'est
pas
loin
!
'
,
//
contenu
qui
sera
affiché
'
map
'
:
oMap,
//
carte
sur
laquelle
est
affichée
l'InfoWindow
'
position
'
:
new
google.
maps.
LatLng
(
46
.
80
,
1
.
70
) //
position
d'affichage
de
l'InfoWindow
}
);
2/ En utilisant la position d'un Marker et la méthode open()
de l'objet google.maps.InfoWindow. La méthode open(map, anchor)
attend deux paramètres :
- map : la carte sur laquelle sera affichée l'InfoWindow ;
- anchor : l'objet auquel s'accroche l'InfoWindow.
oInfo.
open
(
oMap,
oMarker);
On notera que si la position a déjà été initialisée le paramètre anchor peut être omis.
Exemple :
//
création
d'une
infobulle
var
oInfo =
new
google.
maps.
InfoWindow
(
{
'
content
'
:
'
Le
centre
de
la
FRANCE
n\'est
pas
loin
!
'
,
//
contenu
qui
sera
affiché
'
position
'
:
new
google.
maps.
LatLng
(
46
.
80
,
1
.
70
) //
position
d'affichage
de
l'InfoWindow
}
);
//
affichage
de
l'InfoWindow
oInfo.
open
(
oMap);
//
seule
la
référence
à
la
carte
est
passée
en
paramètre
3/ En utilisant la méthode setOptions() de l'objet
google.maps.InfoWindow et en passant en paramètre un objet
contenant les options à modifier sous sa forme littérale :
var
oLatLng =
new
google.
maps.
LatLng
(
46
.
80
,
1
.
70
);
//
position
d'affichage
de
l'InfoWindow
oInfo.
setOptions
(
{
'
map
'
:
oMap,
'
position
'
:
oLatLng}
);
//
passage
des
options
carte
et
position
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;
//
création
de
la
carte
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
}
);
//
création
infobulle
oInfo =
new
google.
maps.
InfoWindow
(
);
//
création
des
markers
for
(
i =
0
;
i <
nb;
i+
+
){
//
création
marker
oMarker =
new
google.
maps.
Marker
(
{
'
position
'
:
new
google.
maps.
LatLng
(
tMarker[
i]
.
lat,
tMarker[
i]
.
lon),
'
map
'
:
oMap,
'
title
'
:
tMarker[
i]
.
title
}
);
//
événement
clic
sur
le
marker
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
) {
//
affectation
du
contenu
oInfo.
setContent
(
tMarker[
i]
.
info);
//
affichage
InfoWindow
oInfo.
open
(
this
.
getMap
(
),
this
);
}
);
}
}
//
init
lorsque
la
page
est
chargée
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 :
//
création
des
markers
for
(
i =
0
;
i <
nb;
i+
+
){
//
création
marker
oMarker =
new
google.
maps.
Marker
(
{
'
numero
'
:
i,
//
ici
on
sauve
la
valeur
de
i
'
position
'
:
new
google.
maps.
LatLng
(
tMarker[
i]
.
lat,
tMarker[
i]
.
lon),
'
map
'
:
oMap,
'
title
'
:
tMarker[
i]
.
title
}
);
//
événement
clic
sur
le
marker
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
) {
//
affectation
du
contenu
en
utilisant
this.numero
oInfo.
setContent
(
tMarker[
this
.
numero]
.
info);
//
affichage
InfoWindow
oInfo.
open
(
this
.
getMap
(
),
this
);
}
);
}
Méthode #2 : passer par une fonction externe à la boucle :
//
fonction
externe
de
création
des
markers
function
setEventMarker
(
marker,
infowindow,
texte){
google.
maps.
event.
addListener
(
marker,
'
click
'
,
function
(
) {
//
affectation
du
texte
infowindow.
setContent
(
texte);
//
affichage
InfoWindow
infowindow.
open
(
this
.
getMap
(
),
this
);
}
);
}
... que l'on appellera dans la boucle de la façon suivante :
//
création
des
markers
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
}
);
//
événement
clicl
sur
le
marker
via
une
fonction
externe
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 :
//
création
des
markers
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
}
);
//
événement
clic
sur
le
marker
passage
par
fonction
anonyme
(
function
(
texte){
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
) {
//
affectation
du
texte
passé
en
paramètre
oInfo.
setContent
(
texte);
//
affichage
InfoWindow
oInfo.
open
(
this
.
getMap
(
),
this
);
}
);
}
)(
tMarker[
i]
.
info);
}
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;
//
création
de
la
carte
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
}
);
//
création
des
markers
for
(
i =
0
;
i <
nb;
i+
+
){
//
création
marker
var
oMarker =
new
google.
maps.
Marker
(
{
'
position
'
:
new
google.
maps.
LatLng
(
tMarker[
i]
.
lat,
tMarker[
i]
.
lon),
'
map
'
:
oMap,
'
title
'
:
tMarker[
i]
.
title
}
);
//
création
infobulle
avec
texte
var
oInfo =
new
google.
maps.
InfoWindow
(
{
'
content
'
:
tMarker[
i]
.
info
}
);
//
événement
clic
sur
le
marker
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
) {
//
affichage
InfoWindow
oInfo.
open
(
this
.
getMap
(
),
this
);
}
);
}
}
//
init
lorsque
la
page
est
chargée
google.
maps.
event.
addDomListener
(
window,
'
load
'
,
initCarte);
Explication :
Au moment de l'exécution de la fonction, c'est la dernière InfoWindow
intialisée qui est prise en compte et donc affichée, c'est celle contenant
tMarker[3].info.
Solution :
Voir les solutions proposées à la question Pourquoi l'InfoWindow n'affiche rien quand je clique sur le marker ?
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 la mise au dessus de l'InfoWindow, 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
,
//
ici
on
surcharge
pour
utilisation
'
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
(
);
//
récupération
de
l'objet
carte
var
index =
map.
zIndexBulle +
+
;
//
incrémentation
et
récupération
bulle.
setZIndex
(
index);
//
affectation
à
l'InfoWindow
bulle.
open
(
map,
this
);
//
affichage
de
l'InfoWindow
}
);
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;
//
création
de
la
carte
oMap =
new
google.
maps.
Map
(
document.
getElementById
(
"
div_carte
"
),
{
'
zIndexBulle
'
:
1
,
//
ici
on
surcharge
pour
utilisation
'
zoom
'
:
6
,
'
center
'
:
new
google.
maps.
LatLng
(
46
.
80
,
1
.
75
),
'
mapTypeId
'
:
google.
maps.
MapTypeId.
ROADMAP
}
);
//
création
des
marqueurs
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
}
);
//
création
infobulle
oInfo =
new
google.
maps.
InfoWindow
(
{
'
content
'
:
tMarker[
i]
.
info
}
);
//
ajout
evenement
sur
click
(
function
(
bulle){
google.
maps.
event.
addListener
(
oMarker,
'
click
'
,
function
(
){
var
map =
this
.
getMap
(
);
//
récup.
de
l'objet
carte
var
index =
map.
zIndexBulle +
+
;
//
incrémentation
et
récupération
bulle.
setZIndex
(
index);
//
affectation
à
l'InfoWindow
bulle.
open
(
map,
this
);
//
affichage
de
l'InfoWindow
}
);
}
)(
oInfo);
}
}
//
init
lorsque
la
page
est
chargée
google.
maps.
event.
addDomListener
(
window,
'
load
'
,
initCarte);
Nota bene : nous utilisons, pour la création des InfoWindows,
la méthode #3 de Pourquoi l'InfoWindow n'affiche rien quand je clique sur le marker ?
Pour masquer une InfoWindow, il suffit d'utiliser la méthode
close() de l'objet google.maps.InfoWindow.
Cette méthode ne prend aucun paramètre.
oInfo.
close
(
);
//
masque
l'InfoWindow
Cette action a le même effet que l'appui sur la croix située dans le coin en haut à droite de l'InfoWindow.
On peut également utiliser la méthode setOptions(), en mettant
l'option map à null. Dans ce cas, on passe en
paramètre un objet contenant les options à modifier sous sa forme littérale.
oInfo.
setOptions
(
{
'
map
'
:
null
}
);