使用'idle'侦听器更新Maps V3.打开InfowWindow会触发此操作并隐藏标记

kam*_*tka 6 google-maps infowindow google-maps-api-3

这会加载地图,获取新结果并删除旧结果:

google.maps.event.addListener(map, 'idle', function() {
    updateMap();
});
Run Code Online (Sandbox Code Playgroud)

那部分效果很好.

当我点击一个标记打开它的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);
    });
} 
Run Code Online (Sandbox Code Playgroud)

任何见解都非常感谢.

bam*_*net 5

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

    最明显的一点就是快速入侵,如果单击一个不触发空闲事件的标记(即中心或其他事件),肯定会造成麻烦.

  2. 不要再使用idle了.活动dragendzoom_changed可能更好地捕捉你正在寻找的特定用户交互.