Pour afficher une fenêtre d'information lorsqu'on clique sur le marqueur, il faut lui ajouter un gestionnaire d'événement sur le clic. On peut aussi décider de réagir au survol :
GEvent.addListener(marker, "click", function() {
// what to do when clicking on marker
});
GEvent.addListener(marker, "mouseover", function() {
// quoi faire quand on survole le marker
});
Dans le gestionnaire d'énévement, nous utiliserons la méthode GMarker.openInfoWindowHtml(), qui prend un seul paramètre : le code Html ou la chaîne de caractères qui apparaîtra comme contenu.
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml("<b>Coucou</b>, ici c'est Reykjavik");
});
Remarque : cette méthode dérive de la méthode GMap2.openInfoWindowHtml() : appliquée à la map, elle prend deux paramètres :
- le premier est un objet GLatLng qui sont les coordonnées pour centrer la fenêtre d'information,
- le second est le code Html ou la chaîne de caractères qui apparaîtra comme contenu.
La fenêtre d'information appartient donc à la map, qui ne peut en posséder qu'une, et non au marqueur : le fait de centrer la pointe de la fenêtre sur le marqueur en crée l'illusion. La principale conséquence de cette règle est qu'on ne peut affichier qu'une seule fenêtre d'information à la fois.
A ce stade, voici deux options d'un marqueur qui peuvent nous être utiles :
- title : équivalent au title d'un href: permet de spécifier une infobulle
- clickable : vrai par défaut. Il peut être intéressant de spécifier cette option (à false) lorsqu'on n'ajoute pas d'événement click à un marqueur, car celui-ci utilise alors moins de ressources.
Voici donc le code de création d'un marqueur, tel qu'utilisé dans notre premier exemple :
var reykjavik = new GLatLng(64.135338, -21.89521) ;
var marker1 = new GMarker(reykjavik, {title: "cliquez pour plus d'informations"});
GEvent.addListener(marker1, "click", function() {
marker1.openInfoWindowHtml("<h2>Reykjavik</h2> <b>capitale</b> de l'Islande");
});
map.addOverlay(marker1);
Création des marqueurs dans une fonction
Pour nous simplifier la vie, nous allons confier la création des marqueurs, avec ou sans icône personnalisée, avec ou sans fenêtre d'information, à une fonction :
function createMarker(point, html, myicon) {
if (myicon != null) {
if (html != null) {
var marker = new GMarker(point, {icon:myicon, title: "cliquez pour plus d'informations"} );
} else {
var marker = new GMarker(point, {icon:myicon, clickable: false} );
}
} else {
if (html != null) {
var marker = new GMarker(point, {title: "cliquez pour plus d'informations"} );
} else {
var marker = new GMarker(point, {clickable: false});
}
}
if (html != null) {
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(html);
});
}
return marker;
}
On peut donc appeler cette fonction de différentes façons selon nos besoins :
var blueIcon = new GIcon(G_DEFAULT_ICON); blueIcon.image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png"; map.addOverlay(createMarker(new GLatLng(64.27951, -20.36138) ,'<p>Geysir</p>')); map.addOverlay(createMarker(new GLatLng(64.135338, -21.89521) ,'<p>Reykjavik</p>', blueIcon )); map.addOverlay(createMarker(new GLatLng(65.683868, -18.11046))); map.addOverlay(createMarker(new GLatLng(64.35, -16.58, null, blueIcon)));
Voir notre deuxième exemple.
Données dans un tableau
On voit que le code commence a être répétitif, grâce à notre fonction. Il peut être automatisé en rangeant les données dans un tableau. Ceci est un bon réflexe, car ainsi données et code sont séparés. C'est un excellent préparatif à notre tutorial sur le chargement asynchrone de ces données par le format Ajax. Explorons ensemble notre exemple :
La construction du tableau de données data est réalisée dans le fichier islande.1.js, et celui-ci est appelé avant le code :
<script src="islande.1.js" type="text/javascript"></script>
Le format d'une donnée est le suivant :
{ coord: {lat: 64.135338, lng: -21.89521},
html: "Reykjavik",
icon: 'blueIcon' }
Après la création de la map, on crée les icônes nécessaires, puis on parcourt data dans une boucle for et on crée les marqueurs au fur et à mesure (nous appelons ici la méthode GMap2.addOverlay à chaque fois, nous aurions aussi pu utiliser le gestionnaire de marqueurs) :
var blueIcon = new GIcon(G_DEFAULT_ICON); blueIcon.image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png";
for (i=0 ; i < data.length ; ++i) {
map.addOverlay(createMarker( new GLatLng(data[i].coord.lat, data[i].coord.lng),
data[i].html,
eval(data[i].icon) ));
}
Pour pouvoir gérer les icones, on indique dans le tableau data un nom. Si ce même nom est repris pour la variable utilisée à la création de l'icône, eval(nom_variable_icone) permet de la passer très simplement à notre fonction générique. Cela évite d'utiliser un switch() sur data[i].icon.
Fenêtres à onglets
Au lieu de la méthode GMarker.openInfoWindowHtml, on peut utiliserGMarker.openInfoWindowTabsHtml. On aura alors une fenêtre à onglets. openInfoWindowHtml prend pour paramètre un tableau de n GInfoWindowTab. Les objets GInfoWindowTab prennent deux paramètres :
- le premier est le label de l’onglet,
- le second est le code HTML ou le texte constituant le contenu.
On va donc devoir créer les différents onglets, puis les relier au marqueur :
var tab = new GInfoWindowTab ("un", "contenu de un");
var tab2 = new GInfoWindowTab ("deux", "contenu de deux");
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowTabsHtml( new Array(tab, tab2));
});
Options
openInfoWindowHtml et openInfoWindowTabsHtml ont un argument supplémentaire optionnel qui permet de spécifier quelques options. Citons les plus intéressantes :
- selectedTab : permet de spécifier l'onglet sélectionné à l'ouverture de la fenêtre
- maxWidth : largeur maximale de la fenêtre, en pixels
- onOpenFn : nom de la fonction à appeler à l’ouverture de la fenêtre.
- __onCloseFn : nom de la fonction à appeler à la fermeture de la fenêtre.
Ce qui donnerait par exemple :
var options = {
maxWidth : 300, selectedTab : 1,
onOpenFn : tracerEvenementOnOpenFn,
onCloseFn : tracerEvenementOnCloseFn
};
function tracerEvenementOnOpenFn() { alert("ouverture"); }
function tracerEvenementOnCloseFn() { alert("fermeture"); }
marker.openInfoWindowTabsHtml( new Array(tab, tab2), options);
Dans notre exemple, nous nous contenterons de présélectionner le deuxième onglet (donc d'index 1) à l'ouverture de la fenêtre :
marker.openInfoWindowTabsHtml( new Array(tab, tab2), {selectedTab : 1});