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);
}			
});