4

API の V3 を使用した Google マップがあります。ドラッグ可能なマーカーが1つあり、静的な他のマーカーがたくさんあります。次のように clear_markers() という関数を呼び出すドラッグ可能なマーカーの dragend リスナーを設定しました。

google.maps.event.addListener(marker_0, "dragend", function() {
    clear_markers();
});

function clear_markers()
{
  if (markers) {
    for (var i = 1; i <= markers.length; i++ ) {
        if(typeof markers[i] !== "undefined") {
            markers[i].setMap(null);
        }
    }
  }
}

for ループを 0 ではなく 1 で開始する理由は、ドラッグ可能なマーカーが最初のマーカーであるため、このマーカーを除くすべてのマーカーをマップからクリアしたいからです。

問題は次のとおりです。

clear_markers(); を呼び出すと、他の方法では問題なく機能し、マーカーはマップから削除されるため、次のように機能します。

$('#mybutton').click(function() {
    clear_markers();
});

ただし、緑色のマーカーをドラッグ アンド ドロップし、dragend リスナーから呼び出された場合は機能しません。マーカーは削除されますが、すぐに再度追加されます。スクリプトを強制終了する for ループの直後に clear_markers() 関数に何かを配置すると、マーカーが削除されるため、マーカーが削除されることはわかっています。ただし、スクリプトの続行が許可されている場合、それらはまだそこにあり、削除されてすぐに再び追加されたことを意味します。

私は他のコードを呼び出していないので、API のバグのように思えます。誰にもアイデアはありますか?

問題を示す実際の例を次に示します。

https://tinker.io/64b68/1

4

2 に答える 2

3

マーカークラスターを削除します。マーカーを追加し直していますが、使用していません。

アップデート:

保持する必要があるため、マーカーを表示しないようにするには、markerClusterer からマーカーを削除する必要があります。

 markerCluster.clearMarkers();

(ただし、そのように使用するにはグローバルにする必要があります)

于 2012-06-28T16:37:37.033 に答える
1

コード内の適切な場所ではなく、正しい方法で eventListener を呼び出します。何が起こっているかを確認するために、eventListener にいくつかのアラートを追加しました。自分で試してみてください:

google.maps.event.addListener(marker_0, "dragend", function() {
    alert("before calling clear_markers()");
    clear_markers();
    alert("markers should be cleared");
});

これは、javascript が「dragend」イベント リスナーに実行されると、内部のコードが実行されることを意味しますが、残りのコードも同様に実行されるため、マップ上にマーカーが再び表示されます。この問題は、イベント リスナーをinitialize()関数の最後に追加することで修正できますvar markerCluster = new MarkerClusterer(map, markers, clusterOptions);

斜体のテキストは間違った説明です。正しい解決策については、以下の回答を参照してください

/---------------------------------------------------------------- --------------------------------------------/

以前の回答を無視して、再編集させてください。繰り返しますが、あなたは正しい方法で eventListener を呼び出しています。リスナー関数に次のコードを追加して、マーカーが表示されないようにするだけです。

google.maps.event.addListener(marker_0, "dragend", function() {
    clear_markers();
    markerCluster.setMap(null);
});

markerCluster を開始すると、マーカーの clear 関数がオーバーライドされるようです。そのため、マップから markerCluster もクリアする必要があります。以前の回答で誤解を招いて申し訳ありませんが、markerCluster は私にとっても新しい概念です。

于 2012-06-28T20:19:17.393 に答える