Skip to content

Instantly share code, notes, and snippets.

@gbakernet
Created February 15, 2011 23:42
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save gbakernet/828536 to your computer and use it in GitHub Desktop.
Save gbakernet/828536 to your computer and use it in GitHub Desktop.
Load Google Maps API using jQuery Deferred.
/*!
* JavaScript - loadGoogleMaps( version, apiKey, language )
*
* - Load Google Maps API using jQuery Deferred.
* Useful if you want to only load the Google Maps API on-demand.
* - Requires jQuery 1.5
*
* Copyright (c) 2011 Glenn Baker
* Dual licensed under the MIT and GPL licenses.
*/
/*globals window, google, jQuery*/
var loadGoogleMaps = (function($) {
var now = $.now(),
promise;
return function( version, apiKey, language ) {
if( promise ) { return promise; }
//Create a Deferred Object
var deferred = $.Deferred(),
//Declare a resolve function, pass google.maps for the done functions
resolve = function () {
deferred.resolve( window.google && google.maps ? google.maps : false );
},
//global callback name
callbackName = "loadGoogleMaps_" + ( now++ ),
// Default Parameters
params = $.extend(
{'sensor': false}
, apiKey ? {"key": apiKey} : {}
, language ? {"language": language} : {}
);;
//If google.maps exists, then Google Maps API was probably loaded with the <script> tag
if( window.google && google.maps ) {
resolve();
//If the google.load method exists, lets load the Google Maps API in Async.
} else if ( window.google && google.load ) {
google.load("maps", version || 3, {"other_params": $.param(params) , "callback" : resolve});
//Last, try pure jQuery Ajax technique to load the Google Maps API in Async.
} else {
//Ajax URL params
params = $.extend( params, {
'v': version || 3,
'callback': callbackName
});
//Declare the global callback
window[callbackName] = function( ) {
resolve();
//Delete callback
setTimeout(function() {
try{
delete window[callbackName];
} catch( e ) {}
}, 20);
};
//Can't use the jXHR promise because 'script' doesn't support 'callback=?'
$.ajax({
dataType: 'script',
data: params,
url: 'http://maps.google.com/maps/api/js'
});
}
promise = deferred.promise();
return promise;
};
}(jQuery));
$(elem).on("myevent", function() {
$.when( loadGoogleMaps( 3, API_KEY, LANG ) )
.then(function() {
!!google.maps // true
});
});
// OR
$(elem).on("myevent", function() {
loadGoogleMaps( 3, API_KEY, LANG )
.done(function() {
!!google.maps // true
});
});
@GFoley83
Copy link

GFoley83 commented Jul 8, 2013

Very useful function, thank you!

Forked and updated with following changes:

  • Tidied JS & made it JSLint compliant
  • Updated script request to Google Maps API to be protocol relative
  • Added "sensor" parameter which defaults to false if not present

https://gist.github.com/GFoley83/5953448

@backflip
Copy link

In case anyone wants to load this using Bower, I made a fork of Gavin's fork available:

"dependencies": {
  "load-google-maps": "https://gist.github.com/8613939.git"
}

@spranger
Copy link

spranger commented Dec 4, 2014

How to use your code with a business version of GM via client=gme-xyz ? My regular GM-API to load is http://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false&amp;client=gme-xyz

@enlacee
Copy link

enlacee commented May 26, 2015

GOOD WORKS! this code it's beautiful 😵

@marchrius
Copy link

I added libraries support in my fork

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment