谷歌地图麻烦:关闭&通过参考传递

时间:2009-05-06 12:37:04

标签: javascript google-maps

我有一些谷歌地图/ Javascript问题。我想我知道问题是什么,但只是不知道如何绕过它。

我的问题的一个例子是here。无论你点击什么标记,第二个出现。我显然将错误的信息传递给我的事件监听器,但我似乎无法正确获取代码。这是代码的缩减部分:

首先,这是我代码的一部分:

if (GBrowserIsCompatible() && mapResults != null) {
  // Read in the JSON
  var mapDetailsArray = loadJSON();

  // Create a map
  var map = new google.maps.Map2(document.getElementById(elementId));
  map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(),
      mapDetailsArray[0].getLongitude()), 13);
  map.addControl(new google.maps.SmallMapControl());

  // Add the points and center
  var mgr = new google.maps.MarkerManager(map);
  var bounds = new google.maps.LatLngBounds();
  for ( var i = 0; i < mapDetailsArray.length; i++) {
    var mapDetails = mapDetailsArray[i];

    var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails
        .getLongitude());
    bounds.extend(point);

    // Create our marker
    var marker = new google.maps.Marker(point);

    // What action do we use to show the hover
    var infoAction = "mouseover";

    marker.value = mapDetails;

    google.maps.Event.addListener(marker, infoAction, function() {
      alert(marker.value);
      map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
    });

    mgr.addMarker(marker, 1);
  }
  mgr.refresh();
}

“marker.value”总是最终设置为mapDetails的最后一个值。如果有的话,我希望它一旦循环结束就“未定义”,那么这个价值不应该消失吗?我已经尝试了各种不同的值(例如marker.value = i + 1;)但它仍然会以两个点的相同值出现。

有没有人知道如何将正确的值传递给事件监听器?

2 个答案:

答案 0 :(得分:6)

改变这个:

google.maps.Event.addListener(marker, infoAction, function() {
      alert(marker.value);
      map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
    });

到此:

google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() {
      alert(marker.value);
      map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
    }})(marker, point, map));

这将创建你想要的闭包。

为清晰起见拆分:

var f = function(marker, point, map)
{
    return function()
    {
        alert(marker.value);
        map.openInfoWindowHtml(point, getResultInfoContent(marker.value));
    }
}

google.maps.Event.addListener(marker, infoAction, f(marker, point, map));

答案 1 :(得分:3)

上述答案不是很直观 - 正如格雷格所说。

当您向对象添加事件时,该对象将向下传递,以便您可以通过闭包中的“this”访问它。如果您将“marker.value”替换为“this.value”,则问题将得到解决。如果你需要传递更多的东西,你将它绑定到对象并传递下去:

marker.a = 1
marker.b = 2
marker.c = 3

在闭包内,this.a将为1,依此类推......

相关问题