0

情報ウィンドウで複数のマーカーを使用しています。すべてが正常に機能しています。問題は、マーカーをクリックすると情報ウィンドウが開きますが、他のマーカーをクリックしても閉じないことです。開いたままです。したがって、この問題の解決策を提供できます。

コードはhttp://goo.gl/s0WZxにあります

    var berlin = new google.maps.LatLng(52.520816, 13.410186);
    var neighborhoods = [
    new google.maps.LatLng(52.511467, 13.447179),
    new google.maps.LatLng(52.549061, 13.422975),
    new google.maps.LatLng(52.497622, 13.396110),
    new google.maps.LatLng(52.517683, 13.394393)
    ];

    var markers = [];
    var iterator = 0;

    var map;

  function initialize() {
    var mapOptions = {
      zoom: 12,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      center: berlin
    };

    map = new google.maps.Map(document.getElementById("map_canvas"),
            mapOptions);
  }

  function drop() {
    for (var i = 0; i < neighborhoods.length; i++) {
      setTimeout(function() {
        addMarker();
      }, i * 200);
    }
  }

  function addMarker() {
    var marker = new google.maps.Marker({
      position: neighborhoods[iterator],
      map: map,
      draggable: false
     });
    markers.push(marker);

    var contentString = $("#pop"+iterator).html();

    var infowindow = new google.maps.InfoWindow({
        content: contentString,
        maxWidth: 300,
        maxHeight: 500
    });


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

    iterator++;
  }
4

2 に答える 2

4

infowindowマーカーと同じ数のsを作成しています。infowindowあなたの場合、1つで十分だと思います。したがって、1つだけで作業するinfowindow場合は、これをグローバルスコープに実装できます。

 //Using lazy initialization. 
 //InfoWindow will be created only after the first call 
 var getInfoWindow = (function(){
     var _instance = null;
     return function(){
        if(_instance == null){
            _instance = new google.maps.InfoWindow({
                            maxWidth: 300,
                            maxHeight: 500
                        });
        }
        return _instance;
     };
 })(); 

contentStringまた、クリックイベントで表示する必要があるすべてのマーカーを保存する必要があります。したがって、メソッドの最終的な変更は次のaddMarkerようになります。

function addMarker() {
var marker = new google.maps.Marker({
  position: neighborhoods[iterator],
  map: map,
  draggable: false
 });
markers.push(marker);
//Storing content html
marker.contentString = $("#pop"+iterator).html();

google.maps.event.addListener(marker, 'click', function() {
  //Setting content of InfoWindow
  getInfoWindow().setContent( marker.contentString );
  //Opening
  getInfoWindow().open(map,marker);
});

iterator++;
}
于 2012-04-13T15:44:09.310 に答える
1

varinfowindowをaddMarker関数の外に置きます。このような:

var infowindow = new google.maps.InfoWindow();

次に、addMarker関数内で使用します

infowindow.setContent(contentString);

このようにして、情報ウィンドウは1回だけ作成されます。別のマーカーをクリックすると、ウィンドウが移動してコンテンツが設定されます。

于 2012-04-13T14:11:23.240 に答える