2009-12-08 20 views
0

Voici la situation:GMarker onmouseout événement déclenché trop tôt

Sur mon Google Map, je suis en train d'ouvrir une fenêtre d'information html à chaque fois que l'utilisateur déplace sa souris sur un GMarker. Cette fenêtre doit être fermée lorsque le pointeur est hors du marqueur.

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

Qu'est-ce qui se passe est que l'événement onmouseout est trop tôt tiré, de sorte que la fenêtre d'information ouvre et se ferme juste après. Je suppose que la souris n'est plus sur le marqueur, mais sur la fenêtre d'information provoquant le déclenchement de l'onmouseout.

Comment puis-je faire pour laisser la fenêtre d'informations ouverte jusqu'à ce que mon pointeur se trouve réellement hors du marqueur?

Répondre

1

Je voudrais utiliser une minuterie et une variable qui dicte si c'est OK pour fermer la fenêtre. Fondamentalement, une minuterie démarre dans l'événement mouseover et cette minuterie change une variable. L'événement mouseout ferme alors que la fenêtre si elle est OK pour fermer

comme

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

Cela ne répond pas directement à votre question, mais il fonctionnera comme une solution de contournement.

J'espère que ça aide!

Chris

+0

Ça me semble une bonne solution de contournement ... – RedBlueThing

1

Une chose qui peut arriver est que l'ouverture d'un infowindow Google peut faire la carte pour effectuer un panoramique pour que l'ensemble du infowindow être visible dans la fenêtre et non occultée par l'un des contrôles. Le mouvement panoramique peut entraîner le déplacement du marqueur sous la souris, provoquant un passage du curseur. Une façon de gérer cet effet est d'utiliser l'option non documentée {suppressMapPan: true} sur votre infowindow. Une autre façon d'y remédier est d'utiliser un infowindow non-Google qui ne fait pas le panoramique de la carte.

Une autre chose qui peut arriver est que vous pourriez avoir un GIcon personnalisé mal conçu. Si le .infoWIndowAnchor est trop bas, l'infowindow lui-même pourrait voler le mouseover, causant un mouseout sur le marqueur. Vous pouvez gérer cela en définissant la coordonnée y du .infoWindowAnchor plus négative.

Cependant, lorsque tout fonctionnera, vous trouverez probablement qu'une carte qui ouvre l'infowindow sur le marqueur mouseover est difficile à utiliser. Vous obtenez une meilleure interface utilisateur, que certains utilisateurs connaissent déjà, en affichant uniquement une petite info-bulle au survol de la souris et en affichant uniquement l'infowindow complet lorsque le marqueur est cliqué.

+0

Je suis d'accord avec votre dernier point, je discute encore avec le client. –

0

Il arrive aussi dans d'autres domaines de JavaScript/HTML.

Parfois, vous devez lier un gestionnaire à un événement, mais seulement après l'actuel traité car elle est appelée immédiatement ...

Ainsi, au lieu de

GEvent.addListener(...); 

Je ne

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

Pour donner au thread en cours le temps de terminer la gestion de l'événement en cours.

Espérons que cela aide.