情况如下:
在我的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被触发。
如何让信息窗口打开,直到我的指针实际上超出标记?
答案 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)
可能发生的一件事是,打开Google infowindow会导致地图平移,以便整个infowindow在视口中可见,而不会被任何控件遮挡。平移运动可能导致标记从鼠标下方移出,导致鼠标移出。处理这种影响的一种方法是在infowindow上使用未记录的{suppressMapPan:true}选项。处理它的另一种方法是使用不会平移地图的非谷歌信息窗。
可能发生的另一件事是你可能有一个设计不正确的自定义GIcon。如果.infoWIndowAnchor太低,infowindow本身可能会窃取鼠标悬停,导致鼠标悬停在标记上。你可以通过设置.infoWindowAnchor的y坐标来处理它。
但是,当你完成所有工作时,你可能会发现在标记鼠标悬停上打开信息窗的地图很难使用。您可以获得更好的用户界面,以及一些用户已经熟悉的用户界面,只需在鼠标悬停时显示一个小工具提示,并且仅在单击标记时显示完整的infowindow。
答案 2 :(得分:0)
它也发生在JavaScript / HTML的其他领域。
有时你必须将一个处理程序绑定到一个事件,但只有在处理完一个事件之后,因为它会被立即调用...
所以而不是
GEvent.addListener(...);
我做
setTimeout(function() { GEvent.addListener(...); }, 1);
为当前线程提供完成处理当前事件的时间。
希望这有帮助。