0

状況は次のとおりです。

私の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イベントの発生が早すぎるため、情報ウィンドウがその直後に開閉します。

私の推測では、マウスはもはやマーカーの上ではなく、情報ウィンドウの上にあり、マウスアウトが発射されます。

ポインタが実際にマーカーから外れるまで情報ウィンドウを開くにはどうすればよいですか?

4

3 に答える 3

1

発生する可能性のあることの1つは、Google情報ウィンドウを開くと、情報ウィンドウ全体がビューポートに表示され、どのコントロールによっても隠されないように、マップがパンする可能性があることです。パンの動きにより、マーカーがマウスの下から移動し、マウスアウトが発生する可能性があります。この影響に対処する1つの方法は、情報ウィンドウで文書化されていない{suppressMapPan:true}オプションを使用することです。これに対処する別の方法は、地図をパンしないGoogle以外の情報ウィンドウを使用することです。

発生する可能性のあるもう1つのことは、カスタムGIconが正しく設計されていない可能性があることです。.infoWIndowAnchorが低すぎると、情報ウィンドウ自体がマウスオーバーを盗み、マーカー上でマウスアウトが発生する可能性があります。.infoWindowAnchorのy座標をより負に設定することで、これに対処できます。

ただし、すべてが機能するようになると、マーカーのマウスオーバーで情報ウィンドウを開くマップは使いにくいことに気付くでしょう。マウスオーバー時に小さなツールチップを表示するだけで、マーカーがクリックされたときに情報ウィンドウ全体を表示するだけで、より優れたユーザーインターフェイスが得られます。

于 2009-12-09T04:55:28.073 に答える
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();
  }
});

これはあなたの質問に直接答えることはありませんが、回避策として機能します。

それが役に立てば幸い!

クリス

于 2009-12-08T17:32:21.223 に答える
0

JavaScript/HTML の他の領域でも発生します。

ハンドラーをイベントにバインドする必要がある場合がありますが、それはすぐに呼び出されるため、現在のハンドラーを処理した後でのみです...

だから代わりに

GEvent.addListener(...);

そうです

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

現在のイベントの処理を終了する時間を現在のスレッドに与えるため。

お役に立てれば。

于 2009-12-27T07:00:36.440 に答える