Обновление Maps V3 с помощью «бездействующего» слушателя.Открытие InfowWindow вызывает это и скрывает маркер - PullRequest
6 голосов
/ 11 января 2012

Это загружает карту, получает новые результаты и удаляет старые:

google.maps.event.addListener(map, 'idle', function() {
    updateMap();
});

Эта часть прекрасно работает.

Моя проблема возникает, когда я нажимаю на маркер, чтобы открыть его InfoWindow. Открытие окна InfoWindow повторно центрирует карту вокруг маркера, что вызывает прослушиватель сверху, который затем сбрасывает карту, скрывая окно InfoWindow.

Вот как я создаю маркеры / InfoWindow:

var infowindow = new google.maps.InfoWindow({});

function makeMarker(LatLong, markerName) { //this is called from a loop 
    var marker = new google.maps.Marker({
        position: LatLong,
        map: map,
        title:markerName,
        content: "html for the infoWindow"
    });

    //Detect marker click
    google.maps.event.addListener(marker, "click", function() {
        infowindow.setContent(this.content);
        infowindow.open(map, marker);
    });
} 

Любые идеи приветствуются.

Ответы [ 2 ]

5 голосов
/ 11 января 2012

updateMap может быть там, где лежит основная проблема.Когда вы обновляете карту, вам не нужно удалять каждый маркер и добавлять его снова;вместо этого вы хотите удалить те, которые вам больше не нужны, и добавить те, которые вы делаете.(Следует признать, что первая стратегия намного проще и хорошо работает для большинства случаев использования.)

В качестве альтернативы я бы рассмотрел два подхода:

  1. Сохранение глобальногопеременная типа markerClick и реализует что-то вроде:

    google.maps.event.addListener(map, 'idle', function() {
      if(!markerClick){
        updateMap();
        markerClick = false;
      }
    });
    
    
    
    google.maps.event.addListener(marker, "click", function() {
      markerClick = true;
      infowindow.setContent(this.content);
      infowindow.open(map, marker);
    });
    

    Единственное, что действительно является быстрым взломом, и может определенно вызвать проблемы, если щелкнуть маркер, который не вызывает событие ожидания (т.е.один в центре или что-то).

  2. Не используйте idle больше. События , такие как dragend и zoom_changed, могут лучше фиксировать конкретные пользовательские взаимодействия, которые вы ищете.

0 голосов
/ 14 января 2014

Добавление к ответу bamnet и, возможно, это будет кому-то полезно.Это не ответ сам по себе, потому что на него уже ответили, но у меня была почти такая же проблема.В моем случае конфликт был между перетаскиванием и перерисовкой.

Когда пользователь перетаскивал маркер слишком далеко, чтобы панорамировать карту.Следовательно, «холостой ход» будет вызываться где-то в середине процесса перетаскивания, в результате чего движущийся маркер будет расположен в начальной точке.Чтобы избежать этого, я использовал тот же подход, предложенный bamnet, но с использованием событий dragstart и dragend, таких как:

  markerDrag = false;
  google.maps.event.addListener(map, 'idle', function() {
     if(!markerDrag) {
        updateMap();
     }
  });
  google.maps.event.addListener(marker, 'dragstart', function() {
    markerDrag = true;
  });
  google.maps.event.addListener(marker, 'dragend', function() {
    // do stuff here, send new position to the server, etc.
    // ...
    markerDrag = false;
  });

Я надеюсь, что это будет кому-то полезно.

...