GMarker onmouseout活动太快了

时间:2009-12-08 17:28:31

标签: javascript google-maps onmouseout

情况如下:

在我的Google地图上,每当用户将鼠标移到GMarker上时,我都会尝试打开一个html信息窗口。 当指针不在标记处时,应关闭此窗口。

GEvent.addListener(my_marker, "mouseover", function() {
  MaCarte.openInfoWindowHtml(new GLatLng(my_marker.getLatLng().lat()+0.002, my_marker.getLatLng().lng()+0.001),"some text");
});

GEvent.addListener(my_marker, "mouseout", function() {
  if((MaCarte.getInfoWindow().getPoint().lat() == my_marker.getLatLng().lat()+0.002) 
      && (MaCarte.getInfoWindow().getPoint().lng() == my_marker.getLatLng().lng()+0.001))
    MaCarte.closeInfoWindow();
});

发生的事情是onmouseout事件过早发生,因此信息窗口会在其后立即打开和关闭。

我的猜测是鼠标不再在标记上方,而是在信息窗口上方导致onmouseout被触发。

如何让信息窗口打开,直到我的指针实际上超出标记?

3 个答案:

答案 0 :(得分:1)

我会使用一个计时器和变量来决定是否可以关闭窗口。基本上,在mouseover事件中有一个计时器启动,并且该计时器更改了一个变量。然后mouseout事件只关闭窗口,如果可以关闭

GEvent.addListener(my_marker, "mouseover", function() {
  timer.start()
  MaCarte.openInfoWindowHtml(new GLatLng(my_marker.getLatLng().lat()+0.002,  my_marker.getLatLng().lng()+0.001),"some text");
});




GEvent.addListener(my_marker, "mouseout", function() {
  if (okToClose){
    if((MaCarte.getInfoWindow().getPoint().lat() == my_marker.getLatLng().lat()+0.002) 
        && (MaCarte.getInfoWindow().getPoint().lng() == my_marker.getLatLng().lng()+0.001))
      MaCarte.closeInfoWindow();
  }
});

这不能直接回答您的问题,但它可以作为解决方法。

希望它有所帮助!

克里斯

答案 1 :(得分:1)

可能发生的一件事是,打开Goog​​le infowindow会导致地图平移,以便整个infowindow在视口中可见,而不会被任何控件遮挡。平移运动可能导致标记从鼠标下方移出,导致鼠标移出。处理这种影响的一种方法是在infowindow上使用未记录的{suppressMapPan:true}选项。处理它的另一种方法是使用不会平移地图的非谷歌信息窗。

可能发生的另一件事是你可能有一个设计不正确的自定义GIcon。如果.infoWIndowAnchor太低,infowindow本身可能会窃取鼠标悬停,导致鼠标悬停在标记上。你可以通过设置.infoWindowAnchor的y坐标来处理它。

但是,当你完成所有工作时,你可能会发现在标记鼠标悬停上打开信息窗的地图很难使用。您可以获得更好的用户界面,以及一些用户已经熟悉的用户界面,只需在鼠标悬停时显示一个小工具提示,并且仅在单击标记时显示完整的infowindow。

答案 2 :(得分:0)

它也发生在JavaScript / HTML的其他领域。

有时你必须将一个处理程序绑定到一个事件,但只有在处理完一个事件之后,因为它会被立即调用...

所以而不是

GEvent.addListener(...);

我做

setTimeout(function() { GEvent.addListener(...); }, 1);

为当前线程提供完成处理当前事件的时间。

希望这有帮助。