【问题标题】:Load google maps v3 dynamically with ajax使用 ajax 动态加载谷歌地图 v3
【发布时间】:2011-04-24 18:41:44
【问题描述】:

当我尝试使用 ajax 加载谷歌地图 v3 时,结果是:

<script src="http://maps.gstatic.com/intl/en_us/mapfiles/api-3/2/8a/main.js" type="text/javascript"></script>

在源代码中,我想用javascript document.write();

如果没有 iframe,我怎么能做到这一点?

谢谢。

【问题讨论】:

    标签: javascript ajax google-maps google-maps-api-3


    【解决方案1】:

    找到了一个实用的方法。

    在这里使用自定义事件 (jQuery):http://jsfiddle.net/fZqqW/94/

    window.gMapsCallback = function(){
        $(window).trigger('gMapsLoaded');
    }
    
    $(document).ready((function(){
        function initialize(){
            var mapOptions = {
                zoom: 8,
                center: new google.maps.LatLng(47.3239, 5.0428),
                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();
    })());​
    

    编辑 如果在全局范围内声明,loadGoogleMaps 函数可能更实用,尤其是在 ajax 应用程序中工作时。并且布尔检查将防止由于导航而多次加载 api。

    var gMapsLoaded = false;
    window.gMapsCallback = function(){
        gMapsLoaded = true;
        $(window).trigger('gMapsLoaded');
    }
    window.loadGoogleMaps = function(){
        if(gMapsLoaded) return window.gMapsCallback();
        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);
    }
    
    $(document).ready(function(){
        function initialize(){
            var mapOptions = {
                zoom: 8,
                center: new google.maps.LatLng(47.3239, 5.0428),
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
        }
        $(window).bind('gMapsLoaded', initialize);
        window.loadGoogleMaps();
    });
    

    【讨论】:

    • 几乎为我开箱即用。
    • 这也是我发现的,谢谢分享。顺便说一下,我更新了我的答案,请随时发表评论。
    • 在 Durandal 项目中也为我工作过。
    【解决方案2】:

    【讨论】:

    • 如果以后在 SPA 中不需要它怎么办?为什么用户必须等待脚本加载?
    【解决方案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
    }
    

    【讨论】:

    • 它工作正常,但我在 js 控制台中收到警告:Warning: you have included the Google Maps API multiple times on this page. This may cause unexpected errors.
    【解决方案4】:

    您必须在 google maps API 脚本中使用此参数 'callback=initialize' 才能使用 ajax 进行加载:

    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize"></script>
    

    这是一个谷歌地图文档:

    Cómo cargar el API de forma asíncrona

    【讨论】:

    • 你如何确保以后加载这个负载,我希望我的屏幕渲染脚本首先运行。
    【解决方案5】:

    简单有效的解决方案(使用 jQuery):

    var gMapsLoaded = false;
    
    function loadGoogleMaps() { if(!gMapsLoaded) { $.getScript("https://maps.googleapis.com/maps/api/js?sensor=false&async=2&callback=GoogleMapsLoaded", function(){}); } else { GoogleMapsLoaded(); } }
    
    function GoogleMapsLoaded() {
    
       gMapsLoaded = true;
    
       // your code here - init map ...
    }
    

    将其粘贴到您的脚本中,然后在需要时调用函数 loadGoogleMaps();

    【讨论】:

      【解决方案6】:

      我已经更改了一点 Myster 示例,看起来对我来说效果很好

          window.mapapiloaded = function () {
              console.log('$.ajax done: use google.maps');
              createusinggmaps();
          };
      
          $.ajax({
              url: 'http://maps.google.com/-maps/api/js?v=3.2&sensor=true&region=it&async=2&callback=mapapiloaded',
              dataType: 'script',
              timeout: 30000, 
              success: function () {
                  console.log('$.ajax progress: waiting for mapapiloaded callback');
              },
              error: function () {
                  console.log('$.ajax fail: use osm instead of google.maps');
                  createusingosm();
              }
          });
      

      【讨论】:

        【解决方案7】:
        $LAB
          .setOptions({AlwaysPreserveOrder:true})
          .script("http://maps.google.com/maps/api/js?v=3.exp&sensor=false&async=2")
          .script("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/13/6/main.js")
          .script("script.js");
        

        在 script.js 内部初始化您的地图,无需谷歌加载方法,例如:

        Namespace.map = (function(){
        
            var map,
                markers = [];
        
            return{
                init: function(){
                        var myLatlng = new google.maps.LatLng(-25.363882,131.044922),
        
                            mapOptions = {
                              zoom: 4,
                              center: myLatlng,
                              mapTypeId: google.maps.MapTypeId.ROADMAP
                            };
        
                        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        
                        var marker = new google.maps.Marker({
                            position: myLatlng,
                            map: map,
                            title: 'Hello World!'
                        });
        
                        markers.push(marker);
                    }
            };
        
        }());
        

        script.js 内部:

        Namespace.map.init();
        
        // Don't use: google.maps.event.addDomListener(window, 'load', initialize);
        

        注意:不要依赖此方法,因为 Google 会更改第二个 js 文件的名称。这是他们文档中的一个示例:

        https://developers.google.com/maps/documentation/javascript/examples/map-simple-async

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-17
          • 1970-01-01
          • 2014-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多