2009-12-08 3 views
0

Вот ситуация:GMarker onmouseout события выпустил слишком рано

На моей карте Google, я пытаюсь открыть информационное окно HTML каждый раз, когда пользователь перемещает ее мышью над GMarker. Это окно должно быть закрыто, когда указатель находится вне маркера.

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.

Как я могу сделать, чтобы информационное окно открывалось, пока мой указатель не вышел из маркера?

ответ

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(); 
    } 
}); 

это прямо не ответил на ваш вопрос, но он будет работать в качестве обходного пути.

Надеюсь, это поможет!

Крис

+0

Кажется, это хороший способ обхода ... – RedBlueThing

1

Одна вещь, которая может случиться, что открытие InfoWindow Google может вызвать карту для панорамирования для того, чтобы всей InfoWindow, чтобы быть видимым в окне, и не видно из-за какой-либо из элементов управления. Движение панорамирования может привести к тому, что маркер выйдет из-под мыши, вызывая мышь. Один из способов справиться с этим эффектом - использовать недокументированную опцию {suppressMapPan: true} в вашем инфо-окне. Другой способ справиться с этим - использовать не-Google infowindow, который не панорамирует карту.

Другое может случиться так, что у вас может быть неправильно разработанный пользовательский GIcon. Если индекс .infoWIndowAnchor слишком низок, сам инфоузел может украсть курсор мыши, вызывая мышь на маркере. Вы можете справиться с этим, установив более точную координату y .infoWindowAnchor.

Однако, когда вы все это заработаете, вы, вероятно, обнаружите, что карта, открывающая инфоиндикацию на маркерной мыши, неловко используется. Вы получаете лучший пользовательский интерфейс и тот, с которым некоторые пользователи уже знакомы, только отображая небольшую подсказку при наведении курсора мыши и отображая только полный инфоиндерес при щелчке маркера.

+0

Я согласен с вашим последним моментом, я все еще обсуждаю это с клиентом. –

0

Это происходит и в других областях JavaScript/HTML.

Иногда вы должны связать обработчик события, но только после того, как обрабатывается текущий, так как он вызывается сразу ...

Так вместо

GEvent.addListener(...); 

я

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

Чтобы предоставить текущему потоку время для завершения обработки текущего события.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^