2011-09-13 19 views
4

さまざまな情報を表示するためにマーカーを取得できません。マーカーは常に最後の "contentString"の内容を表示します。Googleマップ - 複数マーカー - 1 InfoWindowの問題

私は他のいくつかの投稿を読んだことがありますが、どれも役に立たないようです。

これはコードです:

function setMarkers(branches, map) { 
     var bounds = new google.maps.LatLngBounds(); 
     var contentString = null; 
     var infowindow = null; 
     infowindow = new google.maps.InfoWindow(); 
     for (var i = 0; i < branches.length; i++) { 
      var marker = null; 
      branch = branches[i]; 
      var myLatlngMarker = new google.maps.LatLng(branch[0], branch[1]); 
      contentString = '<p>' + branch[3] + '</p>'; 

      var marker = new google.maps.Marker({ 
       position: myLatlngMarker, 
       map: map, 
       title: branch[2] 
      }); 

      google.maps.event.addListener(marker, 'click', function() { 
       infowindow.setContent(contentString); 
       infowindow.open(map, this); 
      }); 

      bounds.extend(myLatlngMarker); 
     } 

     map.fitBounds(bounds); 
    } 

誰もが私が間違っているのかを見ることができますか?

おかげ

答えて

13

右、

私は解決策を見つけました。 'info'というマーカーに追加のプロパティを追加し、 'addlistener'イベント 'infowindow.setContent(this.info)'から参照しました。

function setMarkers(branches, map) { 
    var marker = null; 
    var infowindow = new google.maps.InfoWindow(); 
    var bounds = new google.maps.LatLngBounds(); 

    for (var i = 0; i < branches.length; i++) { 
     branch = branches[i]; 

     var myLatlngMarker = new google.maps.LatLng(branch[0], branch[1]); 

     var marker = new google.maps.Marker({ 
      position: myLatlngMarker, 
      map: map, 
      title: branch[2], 
      info: branch[3], 
      icon: '<%=Icon%>' 
     }); 

     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.setContent(this.info); 
      infowindow.open(map, this); 
     }); 

     bounds.extend(myLatlngMarker); 
    } 

    map.fitBounds(bounds); 
} 
+0

このアプローチの問題は、GoogleがinfoプロパティをMarkerに渡すと何かが壊れる可能性がありますinfoは本当にマーカーではなくinfoWindowのプロパティなので、間違っているようです。 – puckhead

+0

すばらしい解決策! –

1

あなたはforループの代わりに、ループの内外情報ウィンドウとcontentStringを宣言したことがありますか?

function setMarkers(branches, map) { 
     var bounds = new google.maps.LatLngBounds(); 

     for (var i = 0; i < branches.length; i++) { 
      var infowindow = new google.maps.InfoWindow(); 
      var contentString = ""; 
      var marker = null; 
      branch = branches[i]; 
      var myLatlngMarker = new google.maps.LatLng(branch[0], branch[1]); 
      contentString = '<p>' + branch[3] + '</p>'; 

      var marker = new google.maps.Marker({ 
       position: myLatlngMarker, 
       map: map, 
       title: branch[2] 
      }); 

      google.maps.event.addListener(marker, 'click', function() { 
       infowindow.setContent(contentString); 
       infowindow.open(map, this); 
      }); 

      bounds.extend(myLatlngMarker); 
     } 

     map.fitBounds(bounds); 
    } 
+0

はい、違いはありません – user441365

+0

'infowindow.setContent(contentString);' addListenerの外側ですか? – bjornruysen

+0

違いはありません – user441365

0

イム同じ問題を抱えて:ここで

が更新されたコードです。それはそれは時にクリックイベント火災に設定されているものですので、それは常に最後contentStringを表示

setMarkers(map, airports); 
} 

function setMarkers(map, locations) 
    { 
    //you only need 1 infoWindow 
    var infowindow = new google.maps.InfoWindow({ 
     content: "holding" //content will be set later 
    }); 

    for (var i = 0; i < locations.length; i++) 
    { 
     var airport = locations[i]; 
     var myLatLng = new google.maps.LatLng(airport[1], airport[2]); 
     var marker = new google.maps.Marker({ 
      position: myLatLng, 
      map: map, 
      title: airport[0], 
      zIndex: airport[3], 
      html: airport[4], 
     }); 




     google.maps.event.addListener(marker, 'click', function() { 
       infowindow.setContent(this.html);//set the content 
       infowindow.open(map,this); 
     }); 
    } 
    } 
+0

上記のように、このアプローチの問題は、GoogleがMarkerにhtmlプロパティを追加すると、何かが壊れる可能性があるということです。 htmlは本当にマーカーではなくinfoWindowのプロパティなので、間違っているようです。 – puckhead

12

理由がある:私はタイトルはしかし、このコードを使って異なる表示され得ることができました。 forループの各繰り返しで上書きされます。

クロージャを使用してイベントハンドラを割り当て、関数の引数としてcontextStringを渡して、実際のハンドラを返す必要があります。

google.maps.event.addListener(marker, 'click', function(content) { 
    return function(){ 
     infowindow.setContent(content);//set the content 
     infowindow.open(map,this); 
    } 
}(contentString)); 
+0

あなたは神様です。ありがとう:)! – pufAmuf

+0

これは正解です –

関連する問題