Mise à jour de Google Maps version 3 avec « ralenti » Listener. L'ouverture déclenche InfowWindow et ce cache le marqueur

StackOverflow https://stackoverflow.com/questions/8810979

Question

Cette charge la carte, obtient de nouveaux résultats et supprime les anciens:

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

Cette partie fonctionne très bien.

Mon problème vient quand je clique sur un marqueur pour l'ouvrir de InfoWindow. Ouverture d'un centre de re-InfoWindow la carte autour du marqueur, ce qui déclenche l'Listener d'en haut, qui remet à zéro alors la carte, se cachant le InfoWindow.

Voici comment je crée les marqueurs / 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);
    });
} 

Toutes les idées sont très appréciés.

Était-ce utile?

La solution

updateMap peut-être où le problème sous-jacent est. Lorsque vous mettez à jour la carte que vous avez vraiment pas besoin d'être supprimer chaque marqueur et l'ajouter à nouveau; au lieu que vous souhaitez supprimer ceux que vous ne avez plus besoin et ajouter ceux que vous faites. (Il est vrai que, la première stratégie est beaucoup plus simple et fonctionne bien pour la plupart des cas d'utilisation.)

Sinon, il y a deux approches j'explorerai:

  1. magasin une variable globale comme markerClick et mettre en œuvre quelque chose comme:

    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);
    });
    

    L'un être de ceveat qui est vraiment un hack rapide, et pourrait certainement causer des problèmes si un marqueur est cliqué qui ne déclenche pas l'événement de repos (à savoir d'un dans le centre ou quelque chose).

  2. Ne pas utiliser idle plus. comme dragend et zoom_changed pourrait mieux saisir l'utilisateur spécifique les interactions que vous cherchez.

Autres conseils

Ajoutant à la réponse de Bamnet et peut-être il sera utile pour quelqu'un. Il n'est pas une réponse en soi, car il était déjà répondu mais j'avais presque le même problème. Dans mon cas, le conflit était entre glisser redessiner.

Lorsque l'utilisateur trainait et en prenant le marqueur trop loin que la carte était éreinté. Par conséquent, le « ralenti » serait appelé quelque part au milieu du processus de glisser-déposer provoquant le marqueur en mouvement à être positionné sur le point de départ. Pour éviter cela, je l'ai employé la même approche proposée par Bamnet mais en utilisant les événements dragstart et dragend comme suit:

  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;
  });

J'espère que ce sera utile pour quelqu'un.

scroll top