【问题标题】:GMarker onmouseout event fired too soonGMarker onmouseout 事件触发得太早
【发布时间】:2009-12-27 15:00:36
【问题描述】:

情况如下:

在我的 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 被触发。

如何才能让信息窗口打开,直到我的指针实际离开标记?

【问题讨论】:

    标签: javascript google-maps onmouseout


    【解决方案1】:

    我会使用计时器和变量来指示是否可以关闭窗口。基本上,在鼠标悬停事件中启动一个计时器,并且该计时器会更改一个变量。 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();
      }
    });
    

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

    希望对你有帮助!

    克里斯

    【讨论】:

      【解决方案2】:

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

      可能发生的另一件事是您可能有一个设计不正确的自定义 GIcon。如果 .infoWIndowAnchor 太低,则信息窗口本身可能会窃取鼠标悬停,从而导致鼠标悬停在标记上。您可以通过将 .infoWindowAnchor 的 y 坐标设置为负数来解决此问题。

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

      【讨论】:

      • 我同意你的最后一点,我仍在与客户讨论。
      【解决方案3】:

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

      有时您必须将处理程序绑定到事件,但只能在处理当前事件之后,因为它会立即被调用...

      所以不是

      GEvent.addListener(...);
      

      我愿意

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

      给当前线程时间来完成当前事件的处理。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多