谷歌地图:InfoWindow自动平移后关闭

时间:2011-08-02 04:09:47

标签: google-maps-api-3

我有一堆带有标记的地图,以及与每个标记对应的数据表。当用户点击表格中的项目时,会打开相应标记的InfoWindow。当地图缩小并且标记全部可见时,一切正常,但如果地图被放大,并且通过单击表格中的项目打开了屏幕外标记的InfoWindow,则这是什么发生的情况:

  1. 地图滚动到正确的位置,InfoWindow已经打开
  2. 地图停止平移,InfoWindow消失。
  3. 有关可能发生的事情以及如何解决此问题的任何建议?

3 个答案:

答案 0 :(得分:4)

好吧,这个问题与我在地图上使用Marker Clusterer的事实有关......基本上,发生了以下情况:

  1. 点击表格中的项目,InfoWindow打开
  2. 地图会平移到显示InfoWindow
  3. 的位置
  4. 平移完成后,Marker Clusterer会重新绘制(如果需要),并强制InfoWindow关闭。
  5. 我的解决方案是,当点击表格中的项目时,我会得到相应的Marker's latlng,手动平移到此位置,等待通过'idle'监听器完成平移,并在完成时(并且Clusterer完成了它的重新绘制),然后我打开InfoWindow

    // get map, marker positions
    var mapLatLng = GLOBAL_map.getCenter();    
    var markerLatLng = GLOBAL_markers[index].getPosition();
    
    // pan the map
    if(!markerLatLng.equals(mapLatLng)) {
      // map will need to pan
      GLOBAL_map.panTo(markerLatLng);
      google.maps.event.addListenerOnce(GLOBAL_map, 'idle', function() {
        // open InfoWindow
        GLOBAL_infowindow.setContent(GLOBAL_markers_content[index]);
        GLOBAL_infowindow.open(GLOBAL_map, GLOBAL_markers[index]);
      });
    } else {
      // map won't be panning, which wouldn't trigger 'idle' listener
      GLOBAL_infowindow.setContent(GLOBAL_markers_content[index]);
      GLOBAL_infowindow.open(GLOBAL_map, GLOBAL_markers[index]);
    }
    

答案 1 :(得分:0)

这使我发疯。我的解决方案比较简单。我只是设置了一个计时器,以免在单击图钉后的一秒钟内刷新地图。

从全局开始:

// global timer variable
var clickTime = Date.now() - 1001;

然后定义您的标记点击,例如:

marker.addListener('click', function() {
    infoWindow.setContent(infowincontent);
    infoWindow.open(map, marker);

    clickTime = Date.now();
});

然后设置您的空闲状态,例如:

google.maps.event.addListener(map, 'idle', function () {
    if (Date.now() > (clickTime + 1000))
        updateMap();
});

答案 2 :(得分:0)

不要使用idle事件。改用API spec中的dragendzoom_changed事件,这样您就可以在不刷新地图的情况下打开infoBox。

google.maps.event.addListener(map, 'dragend', function() {
    getMarkers();   
});

google.maps.event.addListener(map, 'zoom_changed', function() {
    getMarkers();   
});