Google Map API – script js pour optimiser le changement
Intro
Dans plein de site que je réalise, il y a une map google map en pied de page. J’ai constaté des ralentissements dans le chargement des pages notamment lors du chargement de la librairie google map api.
le script js
L’idée du script est de charger la carte google map au moment où l’utilisateur va scroller jusqu’à la zone où se trouve la map.
Si l’utilisateur ne scrolle pas jusqu’à la zone de la map, il n’y a pas de chargement de google map = gain dans la vitesse de chargement de la page.
Fichier gmap.js
var params = {
htmlElMap : document.querySelector('#map'),
latCenter : -34.397,
longCenter : 150.644,
zoomMap : 18,
keyAPIGmap : 'Key Google API',
show : true,
urlIcone : document.querySelector('#map').getAttribute('data-icon'),
infoBulleText : '<h2>Name</h2><p>Street</p><p>City</p><p>Phone</p> '
}
// fonction qui permet de connaitre la position d'un élément dans la page
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
var map;
// init google map
function initMap() {
map = new google.maps.Map(params.htmlElMap, {
center: {lat: params.latCenter, lng: params.longCenter},
zoom: params.zoomMap,
scrollwheel: false,
navigationControl: true,
mapTypeControl: true,
scaleControl: true,
draggable: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
mapTypeIds: ['roadmap', 'terrain']
}
});
var marker = new google.maps.Marker({
position: {lat: params.latCenter, lng: params.longCenter},
map: map,
icon : params.urlIcone
});
var infoBulle = new google.maps.InfoWindow( {
content: params.infoBulleText
} );
google.maps.event.addListener(marker, 'click', function() {
infoBulle.open(map, marker);
});
}
// écouter le scrool
window.addEventListener("scroll", function(){
var hh = getCoords(params.htmlElMap) ;
var page = window.outerHeight + window.pageYOffset ;
//console.log('hh.top',hh.top,'page',page,'show',show);
if(page >= hh.top && params.show){
params.show = false;
var libgmap = document.createElement('script');
libgmap.setAttribute('src','https://maps.googleapis.com/maps/api/js?key='+params.keyAPIGmap+'&callback=initMap');
libgmap.setAttribute('async', 'async');
libgmap.setAttribute('defer', 'defer');
document.body.appendChild(libgmap);
}
});