在地图V3中拖动街景小人会触发不需要的点击事件

时间:2014-10-25 11:27:55

标签: javascript google-maps-api-3 google-street-view

我在带有链接街景的V3地图上有两个事件处理程序。 (使用map.setStreetView(全景)链接;)一个是检测地图上的单击,在这种情况下,我更新HTML字段以显示该点的纬度/经度。另一种方法是检测要更改的全景图的位置(position_changed),以便我可以更新HTML字段以显示全景图的纬度/经度。

问题是当我通过拖动街景小人改变全景图时,当我释放鼠标按钮时会触发点击事件。因此,HTML中的两组字段都会被更改,而不仅仅是全景位置。

我试图通过在点击事件发生时测试当前和之前的全景位置来停止它,但似乎全景位置更改事件在点击事件之前触发,这意味着全景的前一个和当前位置已经设置到新位置。

我尝试将单击事件更改为双击,但这也会导致地图放大,这是我不想要的。

我基本上想要的是,如果拖拽的街景小人造成点击事件不触发,或者某种方式检测到他刚被拖动。我想有一种方法是将最后一次全景变化的时间存储在position_change事件中,然后检查触发click事件的时间多久,但这看起来有点hacky。

这是我的两个事件的代码:

 google.maps.event.addListener(map, 'click', function (e) {    
    document.getElementById('mappos').innerHTML = e.latLng.lat().toFixed(6) + "," + e.latLng.lng().toFixed(6);    
 });

  google.maps.event.addListener(panorama, 'position_changed', function() {
      streetvpos = panorama.getPosition();
      document.getElementById('svpos').innerHTML = streetvpos.lat().toFixed(6) + "," + streetvpos.lng().toFixed(6);
  });

fiddle

为了别人的利益,我提出了一个有效的解决方案。我做了一些测试,发现在一个典型的街头小人拖拽上,点击事件几乎立即触发,但是全景位置改变事件需要大约250ms来触发。因此,我在click事件处理程序中使用一个计时器将它延迟1秒,然后检查发生全局更改的时间。通常它大约是750毫秒前。如果它超过2秒,我认为这是一次真正的点击,而不是一个街头小人的行动。

var lastsvchg = 0; // at the top
// ...

    // add a click event handler to give lat/long. Have to cater for the fact that dragging the streetview pegman also triggers a click event
     google.maps.event.addListener(map, 'click', function (e) {
            setTimeout(function() {  // wait 0.5 seconds to let pano_changed trigger first in case pegman being dragged
                if (new Date() - lastsvchg > 2000) {  // ignore if due to pegman being dragged in last 2 seconds
                    document.getElementById('mappos').innerHTML = e.latLng.lat().toFixed(6) + "," + e.latLng.lng().toFixed(6);
                }
            }, 1000);  // wait 1 second before testing
     });

// detect changes to streetview position. Could use position_changed event also.
      google.maps.event.addListener(panorama, 'pano_changed', function() {
          lastsvchg = new Date(); // to check if click event triggered by pegman move
          svpos = panorama.getPosition();
          document.getElementById('svpos').innerHTML = svpos.lat().toFixed(6) + "," + svpos.lng().toFixed(6);
      });

1 个答案:

答案 0 :(得分:0)

您是否只是将click事件绑定到地图容器,或者您是否使用了正确的函数`google.maps.event.trigger()'每次点击活动?

您可以在this

查看http://gmaps-samples-v3.googlecode.com/svn/trunk/map_events/map_events.html页面的来源