我正在尝试异步加载我的谷歌地图,它可以工作,但它加载地图两次。如果我删除“
box.onload = initialize;
”,这会阻止该问题,但信息框不会显示...我该如何修复我的代码,以便它只加载地图一次并显示信息框。
function loadScript() {
var map = document.createElement('script');
map.type = 'text/javascript';
map.src = 'https://maps.googleapis.com/maps/api/js?key=key_goes_here&sensor=false&callback=initialize';
document.body.appendChild(map);
map.onload = function() {
var box = document.createElement('script');
box.type = 'text/javascript';
box.src = 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox_packed.js';
document.body.appendChild(box);
box.onload = initialize;
};
}
window.onload = loadScript;
地图出现两次,因为您拨打了
initialize
两次。
在解决这个问题之前,让我们先简化一下代码。永远不要让自己重复这样的代码块;相反,将其变成一个通用函数。
另外,不要从 googlecode.com 加载 infobox.js; Google 代码不是 CDN。加载您自己的副本。
所以,代码可能如下所示:
function addScript( url, callback ) {
var script = document.createElement( 'script' );
if( callback ) script.onload = callback;
script.type = 'text/javascript';
script.src = url;
document.body.appendChild( script );
}
function loadMapsAPI() {
addScript( 'https://maps.googleapis.com/maps/api/js?key=key_goes_here&sensor=false&callback=mapsApiReady' );
}
function mapsApiReady() {
addScript( 'infobox.js', initialize );
}
window.onload = loadMapsAPI;
我创建了这个脚本。您可以调用它并添加任何回调函数,因此您只需将其包含到您的脚本中并调用
googleMapsLoadAsync(function(){alert('谷歌地图已加载'); });
脚本
var googleMapsAsyncLoaded = false;
var googleMapsAsyncCallback = function(){ };
function googleMapsLoadAsync(callback) {
if (typeof callback !== 'undefined') { googleMapsAsyncCallback=callback; }
if(!googleMapsAsyncLoaded) {
$.getScript('https://maps.googleapis.com/maps/api/js?sensor=false&async=2&callback=googleMapsAsyncLoadedFunction');
} else {
googleMapsAsyncLoadedFunction();
}
}
function googleMapsAsyncLoadedFunction() {
googleMapsAsyncLoaded = true;
if(googleMapsAsyncCallback && typeof(googleMapsAsyncCallback) === "function") {
googleMapsAsyncCallback();
}
googleMapsAsyncCallback = function(){ };
}
如果您使用“旧版标签”,您可以附加
?callback=init_maps
,并且 init_maps 函数将在脚本准备好后被调用:
<script async
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&callback=init_map">
</script>
<script>
function init_map() {
// Do stuff with Google Maps
}
</script>
https://developers.google.com/maps/documentation/javascript/load-maps-js-api#use-legacy-tag