【问题标题】:Google Maps API InfoWindow tied to last markerGoogle Maps API InfoWindow 绑定到最后一个标记
【发布时间】:2017-04-18 04:35:58
【问题描述】:

我正在尝试为我在地图上放置的每个标记添加一个信息窗口。信息窗口仅显示最后添加的标记。我在这里尝试了其他解决方案,但没有一个有效。目前我正在使用以下代码执行此操作:

(有问题的代码从评论中途开始 //WORK IN PROGRESS)

function placeMarker(data, map){
var lati, lngi, title, details;
var image = 'image.png';

  for(i=0; i < data.length; i++){
    console.log(data[i].eventLocation + " OF TYPE " + data[i].eventType);
    if(data[i].eventName != ""){
      title = data[i].eventName;
    }
    if(data[i].eventDetails != ""){
      details = data[i].eventDetails;
    }

      if(data[i].eventLocation == "Location 1"){
        lati = -29.651409;
        lngi = 82.342909;
      }
      else if(data[i].eventLocation == "Location 2"){
        lati = -29.637712;
        lngi = 82.368024;
      }
      else if(data[i].eventLocation == "Location 3"){
        lati = -29.650533;
        lngi = 82.342684;
      }
      else{
        lati = -29.645793;
        lngi = 82.347717;
        console.log(data[i].eventLocation + " not found");
      }
      // WORK IN PROGRESS
      var infowindow = new google.maps.InfoWindow({
          content: details
        });

      newMarker = new google.maps.Marker({
        position: {lat: lati, lng: lngi},
        title : title,
        map: map,
        icon: image,
        details: details
      });

      newMarker.addListener('click', function() { //needs some work to connect to each marker instead of last one placed
          infowindow.open(map, newMarker);
        });
  }
}

function initMap(data) {
  var uluru = {lat: -29.643220, lng: 82.350427};
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 14,
    center: uluru
  });
 // Marker Images
  var centerMarker = new google.maps.Marker({
    position: {lat: -29.643894, lng: 82.354748},
    map: map,
    icon: image3
  });
  placeMarker(data, map);
}

试图找到解决方案让我可以显示在每个标记上输入的最后信息,但不是相应标记的正确信息。 我把它改成了这样:

newMarker.addListener('click', function() { //needs some work to connect to each marker instead of last one placed
          infowindow.open(map, newMarker);
        });

google.maps.event.addListener(newMarker, 'click', function() { //needs some work to connect to each marker instead of last one placed
          infowindow.open(map, this);
        });

【问题讨论】:

  • 在 for 循环之前创建一个变量 var newMarker = [],然后在 for 循环中用作 newMarker[i] = new google.maps.Mar...... 和 newMarker[i].addListene .... 对 infowindow 执行相同操作,目前您的对象已被覆盖

标签: javascript google-maps google-maps-api-3 infowindow


【解决方案1】:

尝试我的修改..我无法调试您的结果,但如果它有效,请告诉我...如果没有,我想这将帮助您了解我用来迭代循环然后填充空数组的方式包含所有标记信息、详细信息等,并将该事件附加到地图..

  var infoWindow = new google.maps.InfoWindow;
  // open info window
  var onMarkerClick = function() {
    var marker = this;
    infoWindow.setContent( marker.details );
    infoWindow.open(map, marker);
    mkmap.lastmarkeropened = marker;
  };
  // close the info window
  google.maps.event.addListener(map, 'click', function() {
    infoWindow.close();
  });

  var marker = [] ;
  // loop start
  for(i=0; i < data.length; i++){
    console.log(data[i].eventLocation + " OF TYPE " + data[i].eventType);
    if(data[i].eventName != ""){
      title = data[i].eventName;
    }
    if(data[i].eventDetails != ""){
      details = data[i].eventDetails;
    }

      if(data[i].eventLocation == "Location 1"){
        lati = -29.651409;
        lngi = 82.342909;
      }
      else if(data[i].eventLocation == "Location 2"){
        lati = -29.637712;
        lngi = 82.368024;
      }
      else if(data[i].eventLocation == "Location 3"){
        lati = -29.650533;
        lngi = 82.342684;
      }
      else{
        lati = -29.645793;
        lngi = 82.347717;
        console.log(data[i].eventLocation + " not found");
      }

      marker[ i ] = new google.maps.Marker({
        position: {lat: lati, lng: lngi},
        title : title,
        map: map,
        icon: image,
        details: details
      });

      // attach event to open info window
      google.maps.event.addListener(marker[ i ], 'click', onMarkerClick );
    } // end loop

看看这是否有效..

干杯,K

【讨论】:

  • 效果很好!非常感谢您的帮助@oserk!
  • 您必须将所有内容都放在您的 details 中作为标记 .. 所以我想您可以更改如下内容:details+=title; 和位置相同:)
【解决方案2】:

尝试以这种方式放置,在循环之前定义此函数:

var assignListener = function(markerObj, infoWindowObj){
                        return function() {
                               infoWindowObj.open(map, markerObj);
                                };
                      };

然后通过该函数添加监听器:

 newMarker.addListener('click', assignListener(newMarker, infowindow) );

【讨论】:

  • 我第一次尝试的解决方案仍然遇到同样的问题,现在每个图钉上都会显示一个信息窗口;但是,最后输入的“详细信息”在每个引脚上,而不是它所属的唯一引脚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多