将Google地图加载到由ajax加载的div

时间:2013-07-12 13:17:31

标签: php ajax google-maps

我正在使用jquery ajax从解析xml文档的php脚本中获取一些结果。之后ajax调用我想显示来自谷歌api的地图,在该php脚本创建的div中( 这是我的问题 )。

是否可以在ajax调用后将地图API加载到php中创建的<div id="map-canvas">

PHP文件

    ... $xmlData = simplexml_load_file("using an http service");            
    echo "<div id='map-canvas'></div>";  //LOAD MAPP HERE!
    echo "<ul>";
    foreach($xmlData->StopTimes->StopTime as $stopTime){
        echo "<li>",$stopTime->attributes()->Hour,"</li>";
    }
    echo "</ul>";
}

AJAX文件

...
    //station click, show next stops
    $('.station_link').click(function(){
        var station_text = $(this).text();
        $.ajax({                                //make the ajax call
            type: "POST",                       //use POST/GET
            url: "../server_side/nextStop.php", //file to send data
            data: {poststation : station_text},         //postlink -> php($_POST) value / text -> jquery var value
            success: function(data){            //on success, do something
                $('#next_stop').html(data);
                $('#next_stop').show();

            //Google maps API
                 function initialize() {
                      var mapOptions = {
                        zoom: 8,
                        center: new google.maps.LatLng(-34.397, 150.644),
                        mapTypeId: google.maps.MapTypeId.ROADMAP
                      }
                      var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
                    }

                    function loadScript() {
                      var script = document.createElement("script");
                      script.type = "text/javascript";
                      script.src = "http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=TRUE_OR_FALSE&callback=initialize";
                      document.body.appendChild(script);
                    }

                    loadScript();
            }   
            });
        });
    });

这就是我所尝试的(以及更多:p),但我甚至不知道它是否是错误的。

任何帮助或建议都将不胜感激!

- 更新 -

这很简单:

javascript文件

//station click, show next stops
    $('.station_link').click(function(){
        var station_text = $(this).text();
        $.ajax({                                //make the ajax call
            type: "POST",                       //use POST/GET
            url: "../server_side/nextStop.php", //file to send data
            data: {poststation : station_text}, //postlink -> php($_POST) value / text -> jquery var value
            success: function(data){            //on success, do something
                $('#next_stop').html(data);
                $('#next_stop').show();


                // Google maps API
                var mapOptions = {
                    center: new google.maps.LatLng(37.7831,-122.4039),
                    zoom: 12,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };

                new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

            }   
            });
        });
    });

只需将此<script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>添加到HTML文件中即可。

这就是我所想要的,它正在加载<div id="map-canvas">

Ty无论如何都要寻求帮助! 对不起,如果我之前没有说明我的观点,我有点新手;)

3 个答案:

答案 0 :(得分:4)

Google地图必须在您致电center: new google.maps.LatLng(-34.397, 150.644),时加载,因此我认为您应该创建一个虚拟地图并在页面加载时对其进行初始化

<div id="dummy"></div>
<script type="text/javascript">

function initGoogle(){
    myLatLng = new google.maps.LatLng(0,0);
    var mapOptions = {
        zoom: 1,
        center: myLatLng,
        mapTypeId: google.maps.MapTypeId.HYBRID
    };

    map = new google.maps.Map(document.getElementById('dummy'), mapOptions);
}

$(document).ready(function(){
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.id = 'googleMaps';
    script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initGoogle';
    document.body.appendChild(script);
});

</script>

<style type="text/css">
    #dummy { position: absolute; top: -5000px; left: -5000px; }
</style>

然后你可以绑定任何你想要的东西。


注意:我使用了jQuery&#39; $(document).ready(),但是如果你不使用jQuery,你可以搞清楚。

答案 1 :(得分:1)

我怀疑你的initialize没有因为范围问题而被调用,因为它只在Ajax回调的范围内定义,而不是地图SDK期望的全局范围。

如果您必须异步加载Google Maps JS,请使用jQuery.getScript(),然后在getScript的回调中初始化您的地图。

虽然你可以有效地链接两个请求,但效果并不是特别好。

你可以:

  • 创建一个设置为0
  • 的全局变量
  • 触发针对Maps div的Ajax调用
  • 使用getScript异步并发地加载Maps SDK
  • 在Ajax和getScript调用的回调函数中,增加刚刚设置的全局变量
  • 有一个每50ms运行一次的循环(例如递归调用setTimeout),检查你设置的变量的值,等到它等于2,设置超时时间为再检查一次50ms左右
  • 满足上述条件后,如果您知道div和maps API已加载
  • ,请初始化地图

答案 2 :(得分:-2)

您可以在AJAX调用后调用js函数。您可能最好在AJAX调用之外的某处定义gmaps初始化的功能,然后在成功调用php脚本之后调用gmap函数(在需要setTimeout('gmap()', 2000);函数的情况下)。但是当我看到你的脚本时,它首先创建div,然后调用gmap的函数