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

Lee*_*ald 5 javascript google-maps

我有一些Google Maps/Javascript问题.我想我知道问题是什么,但只是不知道绕道而行.

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Gre*_*reg 6

改变这个:

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

对此:

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

这将创建您想要的闭包.

为清楚起见拆分:

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));
Run Code Online (Sandbox Code Playgroud)