2012-07-20 13 views
9

&をロードするマップを作成すると、境界ボックスとズームレベルの両方に基づいてマーカーが破棄されます。マーカーを適切に削除することに本当に問題がありますが、状況によっては時々動作するようです。Google Maps API v3:マーカーが削除されない

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

マーカーが削除されたと思われるときにFirebugコンソールに出力されているようですが、動作しているように見え、境界ボックスのマーカーが変更されたajaxコールからマーカーが再作成されていないことがわかります。

地図上をズームすると、マウスを押し下げたままズームするとマーカーが削除されることがあります。または、最初にズームアウトするとマーカーがすべて削除されることがありますが、再度ズームインして取り除くと元に戻すことはできません。

私のコードのロジックに何か間違っている必要があります。私は困惑しています。

あなたはJSマーカーを削除するためのコード http://www.trailforks.com/map/includes/map.js

ある http://www.trailforks.com/map/test.php?lat=49.352247&lon=-123.202413 のソースを表示することができますが、下

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つのマーカーしかないhttp://www.trailforks.com/map/test.php?lat=49.641783767&lon=-123.49878636730955&z=14

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

enter image description here

+1

実際にバグがあると「バグ」を再現するのが難しいです。あなたのコードを見ればよく書かれており、AFAICSは正しいことをしています。それは問題ではありませんが、 'data [i]'オブジェクト全体を配列からスプライスする前に 'null'に設定しようとしましたか? – dda

+0

よく書かれた、賢明な質問のための+1 ... – dda

+0

この視点をgotoに再現するにはhttp://www.trailforks.com/map/test.php?lat=49.344530719060245&lon=-123.1294569147949&z=13 then clickdrag左のすべての黄色のマーカーが画面外になるようにマウスを移動します。マッカーのajax呼び出しがまだ起動しないように、マウスを押したままその方向にマップをドラッグすると、すべてのマーカーが削除されたことがわかります。しかし、一度にズームアウトしてからもう一度試してみると、おそらく壊れてしまうので、マーカーは今の100%のままです。それらはmapper.dataオブジェクトから削除されます。 – Canadaka

答えて

0

の代わりにやって:発生したイベントハンドラの複数のインスタンスを防ぐため

EDIT、(コメントの後):へ

​​

変更を同時に、グローバル変数を以下のように使用することができる。

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回目のコールを起動する可能性があります。

+0

"bounds_changed"を使用する際の問題は、マウスの動きが少ないたびにAJAX呼び出しのTONを呼び出すことです。これは、マウスを移動させる時間が何百分にも及ぶ可能性があります。とにかく試してみましたが、それでも問題は解決しません。マーカをアンロードしてからズームアウトすると、単一のリスナでもマーカのいずれも削除されません。また、dragendまたはzoom_changedのいずれかを有効にしてテストしました。 – Canadaka

+0

これは、イベントが処理されていることを示すグローバル変数で簡単に防止できます。 (私の返事に編集を参照してください)。 – Marcelo

+0

上記のコードはまだ動作しません、それは本当であるようには思われません、そして、私は火かき棒コンソールの中止されたPOSTのトーンを得る、地図は超遅いです。 1つのリスナーだけを持つのは良いことですが、削除できないマーカーの問題は、1つのリスナーを有効にして問題を解決できるので、複数のリスナーを持つことには関係しません。 – Canadaka

3

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

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

こちらがお役に立てば幸いです。