动态加载Google Maps api

时间:2009-09-09 09:53:19

标签: google-maps dynamic

我试图动态加载谷歌地图API。 我正在使用以下代码:

var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://www.google.com/jsapi?key=<MY_KEY>;
head.appendChild(script);

但在尝试创建地图时

map = new GMap2(document.getElementById("map"));

map = new google.maps.Map2(document.getElementById("map"));

我收到了谷歌(或GMap2)未定义的错误。

4 个答案:

答案 0 :(得分:9)

你可以这样做。您可以在网址中添加回调函数名称。它会在API加载时调用。必须可以在文档的范围内访问该回调函数。

我之前通过使用jQuery在窗口上触发自定义事件来做到这一点:http://jsfiddle.net/fZqqW/5/

使用“http://maps.google.com/maps/api/js?sensor=false&callback=gMapsCallback

window.gMapsCallback = function(){
    $(window).trigger('gMapsLoaded');
}

$(document).ready((function(){
    function initialize(){
        var mapOptions = {
            zoom: 8,
            center: new google.maps.LatLng(-34.397, 150.644),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
    }
    function loadGoogleMaps(){
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type","text/javascript");
        script_tag.setAttribute("src","http://maps.google.com/maps/api/js?sensor=false&callback=gMapsCallback");
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
    }
    $(window).bind('gMapsLoaded', initialize);
    loadGoogleMaps();
})());​
  

异步加载API

     

您可能希望在页面加载后加载Maps API JavaScript代码   完成装载或按需装载。为此,您可以注入自己的    标记响应window.onload事件或函数调用,   但您还需要另外指示Maps JavaScript API   bootstrap延迟执行应用程序代码,直到地图   JavaScript API代码已完全加载。您可以使用回调来执行此操作   参数,作为执行函数的参数   完成加载API。

     

以下代码指示应用程序加载Maps API   页面完全加载后(使用window.onload)并写入   将JavaScript API映射到页面中的标记。另外,   我们指示API只在之后执行initialize()函数   通过将callback = initialize传递给Maps

来完全加载API

请参阅此处:https://developers.google.com/maps/documentation/javascript/tutorial

答案 1 :(得分:5)

确保在Javascript加载完成之前没有实例化地图。

此外,如果您想使用AJAX API加载器,您需要这样做:

<script src="http://www.google.com/jsapi?key=ABCDEFG" type="text/javascript"></script>
<script type="text/javascript">
    google.load("maps", "2.x");

    // Call this function when the page has been loaded
    function initialize() {
        var map = new google.maps.Map2(document.getElementById("map"));
        map.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);
    }
    google.setOnLoadCallback(initialize);
</script>

否则,只需使用常规Maps API脚本源:

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=abcdefg&sensor=true_or_false" type="text/javascript"></script>

答案 2 :(得分:3)

我已经这样做了......这个例子使用了jQuery和谷歌地图v3.x

$.getScript("http://maps.google.com/maps/api/js?sensor=true&region=nz&async=2&callback=MapApiLoaded", function () {});

function MapApiLoaded() {
    //.... put your map setup code here: new google.maps.Map(...) etc
}

答案 3 :(得分:0)

这对我有用:

    const myApiKey = `12345`;
    const lat = -34.397;
    const lng = 150.644;
    const zoom = 8;

    const parentElement = document.getElementById(`map`); // a <div>
    const script = document.createElement(`script`);
    script.src = `https://maps.googleapis.com/maps/api/js?key=${myApiKey}`;
    script.async = true;
    script.defer = true;
    script.onload = function () {
        new google.maps.Map(parentElement, {
            center: {lat, lng},
            zoom
        });
    };
    parentElement.insertBefore(script, null);