Google地图为每个地图添加了多个标记和信息窗口?

时间:2017-07-28 08:07:00

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

我的代码是这样的:

function algolia_search(position) {
  clearOverlays();
var APPLICATION_ID = 'PSH...VAKL';
var SEARCH_ONLY_API_KEY = '2eb...efa8';
var INDEX_NAME = 'entities';
var PARAMS = { hitsPerPage: 150 };
// Client + Helper initialization
var algolia = algoliasearch(APPLICATION_ID, SEARCH_ONLY_API_KEY);
var algoliaHelper = algoliasearchHelper(algolia, INDEX_NAME, PARAMS);
// Map initialization
algoliaHelper.on('result', function(content) {
    renderHits(content);
  var i;
  // Add the markers to the map
  for (i = 0; i < content.hits.length; ++i) {
    var hit = content.hits[i];
    var infowindow = new google.maps.InfoWindow({
      content: hit.name
    });
    var marker = new google.maps.Marker({
      position: {lat: hit._geoloc.lat, lng: hit._geoloc.lng},
      map: map,
      label: hit.name,
      animation: google.maps.Animation.DROP,
      index: i
    });
    marker.addListener('click', function() {
      infowindow.open(map, marker);
    });
    addListenerOnPoint(marker);
    markers.push(marker);
    infos.push(infowindow);
  }
});
function renderHits(content) {
  $('#container').html(JSON.stringify(content, null, 2));
}
  algoliaHelper.setQueryParameter('aroundRadius', 200);
  algoliaHelper.search();
}

现在标记工作得非常好,但信息窗口却没有。无论我点击哪个标记,它都会显示一个标记的信息窗口,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

问题说明

infowindow会向您显示来自一个标记的数据,因为当您点击它们时,它们会调用:

infowindow.open(map, marker);

在点击它们时,您是否认为infowindowmapmarker的值分别为?

您的假设是,当for循环正在运行时,他们将保留您设置 的值

当您点击标记时, for循环已完全运行 infowindowmarker的值恰好会设置为for循环的最后一个值。

建议的解决方案

解决方法是找到一种方法来封装循环的每次迭代的数据,这些迭代将在调用侦听器时持续存在。

执行此操作的两种方法是使用ES6块作用域let而不是var或使用n IIFE(立即调用函数表达式)来封装infowindow和{的状态{1}}循环的每一步。

  

使用marker

let
     

上述作品因为有效发生的是一个新的   为每个for(i = 0; i < content.hits.length; ++i) { // rest of code above --^ let infowindow = new google.maps.InfoWindow({content: hit.name}); let marker = new google.maps.Marker({...}); marker.addListener('click', function() { infowindow.open(map, marker); }); // rest of code below --v } infowindow变量创建变量   每次迭代, 几乎就像为每次迭代创建一个新的可修改名称 markermarker0等)< / p>

  

使用IIFE:

marker1