使用回调函数在谷歌地图上放置多个标记

时间:2014-04-07 03:54:08

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

我想在Gmap API上实现一项功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。但是,当我编写如下代码时,它只是不起作用。

PS:代码在语法和排列上可能不完全正确,但它表达了我的意思

// @latlong is an array of tuple (latitude , longtitude)
// @myMap is the google map object passed to the function
function placeMarker( myMap , latlon)
{
  for(var i = 0 ; i < latlon.length ; i ++)
  {
     myMarker = new google.maps.Marker( {
        position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
     });

     google.maps.event.addListener(myMap, 'zoom_changed', function() {
      zoomLevel = myMap.getZoom()       
      if(zoomLevel >= 17)
      {
        myMarker.setMap(myMap)
      }
      else
      {
        myMarker.setMap(null)
      }
  });


}
}

我只是将我的代码更改为:

function placeMarker( myMap , latlon)
{
  for(var i = 0 ; i < latlon.length ; i ++)
  {
     myMarker = new google.maps.Marker( {
        position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
     });

     (function(myMarker_copy){
         google.maps.event.addListener(myMap, 'zoom_changed', function() {
          zoomLevel = myMap.getZoom()       
          if(zoomLevel >= 17)
          {
            myMarker_copy.setMap(myMap)
          }
          else
          {
            myMarker_copy.setMap(null)
          }
      });
      }(myMarker));


}
}

第二个版本有效。 我知道如何使它工作,但是,我真的不知道为什么它工作,为什么另一个不工作。也许这与JS的函数闭包或参数传递原理有关(我已经检查了很多引用,但是其中一些只是持有不同的想法)。有人能给我一个帮助吗?

真的很感激。

1 个答案:

答案 0 :(得分:0)

第一个不起作用的例子:有一个全局变量myMarker和许多事件监听器,它们最后都在一个标记上运行,这是在循环中创建的最后一个标记。

第二个确实有效的例子:因为闭包,每个事件监听器都会收到自己的标记变量的本地副本。因此,当调用事件侦听器时,它具有正确的标记值。