5

次のコードは、json オブジェクトをループして、Google マップにマーカーを配置します。これはうまくいきます。

function displayMarkers(data){
    for(var i = 0; i < data.Lat.length; i++){
        var point = new GLatLng(data.Lat[i],data.Lng[i]);
        marker = new GMarker(point);
        map.addOverlay(marker);

            // here's the problem
        GEvent.addListener(marker, "click", function(){
            alert(data.Name[i]);
        });
    }
}

問題は、すべてのマーカーが常に「i」の最後の値で応答することです。データオブジェクトから正しい情報を取得するためにクリックされたマーカーを特定する方法を見つけようとしています。

作成時にマーカーの配列を作成して、マーカーの位置に基づいてループすることを考えていますが、それは私にとって非常に非効率的です。

いつものように、どんな助けでも大歓迎です。

4

4 に答える 4

5

マップのクリック イベントは、 3 つの異なる要素を渡します。

GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) {
  // overlay = GOverlay or null
  // latlng = GLatLng
  // overlaylatlng = GLatLng or null
});

ユーザーがオーバーレイをクリックしなかった場合、「overlay」と「overlaylatlng」は null になります。

更新: GOverlay をマップから取得する場合は、リスナーを (マーカーではなく) マップに追加する必要があります。GMarkerのクリック イベントは、GLatLng のみを返します。

于 2009-05-13T17:17:26.847 に答える
1

マップは、選択されたマーカーのインデックスを渡す onTap イベントをサポートしています。次の例を参照してください

于 2009-12-21T17:16:50.197 に答える
0

上記の解決策はマーカーの座標のみを返すようで、問題は解決しません。おそらく私は何か間違ったことをしています。

ただし、私がそれを解決した方法は、このようにマーカーにプロパティを追加するだけでした

function createMarker(latlng,name) {
      var marker = new GMarker(latlng);

      // HERE WE GO
      marker.value = name;

      GEvent.addListener(marker,"click", function() {
        addToList(this.value);
      });
      return marker;
}

更新:上記は1つの方法で解決しますが、コメントで述べたように、イベントをマップに添付するのがより簡単な方法です

GEvent.addListener(map, "click", function(marker, point){
    alert(marker);
});
于 2009-05-15T12:40:35.943 に答える
-2

パイのようにシンプル。

    GEvent.addListener(marker, "click", function(o){
            alert(o);
    });
于 2009-05-13T17:05:32.623 に答える