javascript/google maps:为什么我在哪里初始化我的地图(内部与外部函数)很重要

javascript/google maps: Why does it matter where I initialize my map (inside vs outside function)

本文关键字:外部 内部 函数 地图 我的 maps google 为什么 初始化 在哪里 javascript      更新时间:2023-09-26

简短摘要:当我将地图声明移出初始化标记并将其放置在谷歌地图上的函数时,我的地图失败并且根本没有任何标记。为什么在哪里声明我的地图很重要?

更长的版本:我想写一个通用函数,将两个数组的所有纬度和经度放在谷歌地图上。我正在使用以下内容:

 var lat_array = <?php echo $slat.";"; ?>
 var lon_array = <?php echo $slon.";"; ?>
 var markers = []
 function init_map(map) {
     var myOptions = {
         zoom: 14,
         center: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
         mapTypeId: google.maps.MapTypeId.ROADMAP
     };
     map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);
     marker = new google.maps.Marker({
         map: map,
         position: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>)
     });
     var bounds = new google.maps.LatLngBounds();
     var myLatLng = new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>);
     bounds.extend(myLatLng);
     var pinColor = "009ACD";
     var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|" + pinColor,

                                                new google.maps.Size(21, 34),
                                                new google.maps.Point(0,0),
                                                new google.maps.Point(10, 34));

     for(var ii =0; ii<lat_array.length; ii++)
     {
         marker2 = new google.maps.Marker({
             map: map,
             position: new google.maps.LatLng(lat_array[ii], lon_array[ii]),
             icon: pinImage
         });
         markers.push(marker2)
             myNewLatLng = new google.maps.LatLng(lat_array[ii], lon_array[ii]);
         bounds.extend(myNewLatLng);
     }
     map.fitBounds(bounds);
 }

 google.maps.event.addDomListener(window, 'load', init_map);

这工作正常。现在我想修改函数,通过在init_map外部声明地图并将其传递给init_map来使其更通用,以便我可以更轻松地在同一页面上制作许多不同的地图。但是,当我通过将映射声明移动到函数之外来修改代码时,如下所示:

 var myOptions = {
             zoom: 14,
             center: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
             mapTypeId: google.maps.MapTypeId.ROADMAP
         };
         map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);
     function init_map(map) {
                 marker = new google.maps.Marker({
             map: map,
             position: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>)
         });
...

我的代码现在失败了。我在JS控制台中收到此错误,我不知道如何解释:

Uncaught InvalidValueError: setMap: not an instance of Map; and not an instance of StreetViewPanorama

这些术语都没有出现在我的代码中,所以我不知道如何解释它们。除了这个错误之外,现在我还有一张没有图钉的地图。

将映射声明移出我的函数有什么问题?感谢您的任何建议。

    var myOptions = {
       zoom: 14,
       center: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
       mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);
    function init_map(map) {
       marker = new google.maps.Marker({
         map: map,
         position: new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>)
    });

在第一个示例中,您将创建选项和映射变量。但是,您正在破坏函数中的map参数,并将其替换为指向 map-canvas 元素的参数。

当你将该声明移出函数体时,你不再破坏 map 参数;你依赖于它是一个有效的映射。

也许像

function init_map(map) {
   if (!map) {
     map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);
   }
   ...