Created
February 15, 2011 23:42
-
-
Save gbakernet/828536 to your computer and use it in GitHub Desktop.
Load Google Maps API using jQuery Deferred.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* 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)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$(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 | |
}); | |
}); |
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
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"
}
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&sensor=false&client=gme-xyz
GOOD WORKS! this code it's beautiful 😵
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
you can also use this simple jquery plugin that uses the async mode when loading Google Maps api:
http://lucamanzo-soluzione-software.it/wp/?p=5
Usage example:
$(document).ready(function(){
$.gmapstools.init();
$("#my_map_canvas").gmap({lat:37.4221913, lng:-122.08458530000001, draw_marker:true, zoom_level:13});
});
that's done. The plugin loads the Google Maps API only when you do the call (so... after the dom is ready and the page has been built)
$.gmapstools.init();