9

バウンディング ボックスとズーム レベルの両方に基づいてマーカーをロードおよび破棄するマップを作成しています。マーカーを適切に削除するのに本当に問題があります。特定の状況ではうまくいくようです。

マーカー情報を含むオブジェクトがあり、これにはGoogleマップマーカーオブジェクトも含まれています。私のコードは、境界ボックスまたはズームレベルに基づいて市場を削除する必要があるかどうかを検出します。マーカー オブジェクトを「setMap(null);」に設定します。そしてfirebugを使用すると、設定されていることがわかります。次に、親オブジェクトを完全に削除すると、オブジェクトのデータ長が適切に更新されます。

マーカーが削除されたと思われるときにfirebugコンソールに出力し、動作しているようで、バウンディングボックスの変更に関するマーカーのajax呼び出しからマーカーが再作成されていないことがわかります。

それでも、マップをズームすると、マーカーが削除されていることが時々わかります。ズームアウトしてから、マウスを押したままパンバックします。または、最初にズームアウトするとマーカーがすべて削除されることがありますが、もう一度ズームインしてから元に戻すと、マーカーは削除されません。

コードのロジックで何か間違ったことをしているに違いありません。困惑しています。

http://www.trailforks.com/map/test.php?lat=49.352247&lon=-123.202413のソースを表示できます 。JS は http://www.trailforks.com/map/includes/map.jsです。

マーカーを削除するためのコードは下部にあります

function clearMarkerMemory(mapItem, i) {
  google.maps.event.removeListener(mapItem.lis);    // remove stored listener

  mapper.data[i].obj.setMap(null); // remove marker
  mapper.data.splice(i, 1);

  console.log("removed marker "+mapItem.icon+":"+mapItem.nid+' '+mapItem.name);
};

コンソールにさらにデバッグを追加し、2 つのマーカーしかないマップの単純な領域に移動しました

作成されたマーカーを確認できます。マップを少し移動すると、マーカー オブジェクトで検出されたため、マーカーが再作成されていないことがわかります。次に、マーカーの 1 つが画面の外に出るようにビューポートを移動します。マーカーが削除され、マーカー オブジェクトの長さが更新されていることがわかります。しかし、地図をパンしてマーカーの上に戻すと、地図上に残ります。

ここに画像の説明を入力

4

2 に答える 2

4

マップ マーカーの setMap メソッドが非同期であることに気付くまで、私は長い間同様の問題に苦しんでいました。それを呼び出してすぐにそのマーカー オブジェクトへの参照を削除すると、ブラウザーのガベージ コレクターが介入してメモリからクリーンアップし、実際の削除操作が行われないようにします。

splice 呼び出しのある行をコメントアウトして試してみて、それが役立つかどうかを確認してください。それが役立つ場合は、オブジェクトの削除を遅らせるか、実際に削除されるまでマーカー オブジェクトへの参照を保存することを検討する必要があります。それが本当に削除されたかどうかを検出する方法は?何も思いつきません。

これが役立つことを願っています!

于 2012-12-14T08:39:20.433 に答える
0

代わりに:

 google.maps.event.addListener(map, 'dragend', function() {  refreshMarkers(); }); //refresh markers when user moves map
 google.maps.event.addListener(map, 'zoom_changed', function() {  refreshMarkers(); }); //refresh markers when user moves map

次のように変更します。

編集、(コメントの後):

イベント ハンドラーの複数のインスタンスが同時に発生するのを防ぐために、次のようにグローバル変数を使用できます。

google.maps.event.addListener(map, 'bounds_changed', function() {  
if (processing) { // var processing is global
    return;
}
processing = true;
refreshMarkers(); 
processing = false;

}); //refresh markers when user moves map

それは両方の状況をカバーするはずです。現在、2 つの異なるイベント リスナーを使用すると、AJAX 呼び出しが競合する可能性があり、最初の呼び出しが完了する前に 2 番目の呼び出しが発生する可能性があります。

于 2012-07-21T08:21:01.660 に答える