Проблема с Google Maps: закрытие и переход по ссылке - PullRequest
5 голосов
/ 06 мая 2009

У меня проблемы с 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();
}

«marker.value» всегда заканчивается как последнее значение того, что было mapDetails. Во всяком случае, я ожидал бы, что он будет «неопределенным», так как после завершения цикла, разве это значение не должно исчезнуть? Я пробовал разные значения (например, marker.value = i + 1;), но оно будет одинаковым для обеих точек.

Кто-нибудь знает, как я могу передать правильные значения в прослушиватель событий?

Ответы [ 2 ]

6 голосов
/ 06 мая 2009

Изменить это:

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));
3 голосов
/ 23 мая 2009

Приведенный выше ответ не очень интуитивно понятен - как сказал Грег.

Когда вы добавляете событие к объекту, этот объект передается вниз, так что вы можете получить к нему доступ через «this» в замыкании. Если вы замените «marker.value» на «this.value», ваша проблема будет решена. Если вам нужно передать больше материала, вы привязываете его к объекту и передаете его:

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

В закрытии this.a будет 1 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...