【问题标题】:Info bubble always shows up on the last marker [duplicate]信息气泡始终显示在最后一个标记上[重复]
【发布时间】:2013-02-02 11:24:08
【问题描述】:

可能重复:
Google Maps - Multiple markers - 1 InfoWindow problem

我正在制作map,在那里我绘制了一些城镇和地方。 正如您将看到的,当您单击标记时,您将被重定向到相应的页面。但现在我想将链接和其他一些信息放在信息气泡弹出窗口中。所以,我已经将我的代码编辑为:

function setMarkers(map, locations) {
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var infobulle = new google.maps.InfoWindow({content: beach[4], position: myLatLng});
    var marker = new google.maps.Marker({position: myLatLng, map: map, title: beach[0], zIndex: beach[3], clickable: true, icon: beach[5],});
    marker[i] = marker;
    google.maps.event.addListener(marker[i], 'click', function() { 
      infobulle.open(map, marker);
    });
  }
}

但是你可以see here 信息气泡在最后一个位置保持“阻塞”。我真的不知道如何排序。

我有同样的结果:

function setMarkers(map, locations) {
  for (var i = 0; i < locations.length; i++) {
  var beach = locations[i];
  var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
  var infobulle = new google.maps.InfoWindow({content: beach[4]});
  var marker = new google.maps.Marker({position: myLatLng, map: map, title: beach[0], zIndex: beach[3], clickable: true, icon: beach[5]});

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

最新版本:

function setMarkers(map, locations) {
  for (var i = 0; i < locations.length; i++) {
    processBeach(locations[i]);
  }
}
function processBeach(beach) {
  var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
  var infobulle = new google.maps.InfoWindow({content: beach[4]});
  var marker = new google.maps.Marker({position: myLatLng, map: map, title: beach[0], zIndex: beach[3], clickable: true, icon: beach[5]});
  google.maps.event.addListener(marker, 'click', function() { 
infobulle.open(map, marker);
  });
}

【问题讨论】:

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


    【解决方案1】:

    您似乎将marker 变量用于两种不同的目的。一个作为单个标记,一个作为标记数组。但是,如果您使用闭包,则不需要一组标记。试试这个:

    function setMarkers(map, locations) {
      for (var i = 0; i < locations.length; i++) {
        (function(beach) {
          var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
          var infobulle = new google.maps.InfoWindow({content: beach[4], position: myLatLng});
          var marker = new google.maps.Marker({position: myLatLng, map: map, title: beach[0], zIndex: beach[3], clickable: true, icon: beach[5]}))
          google.maps.event.addListener(marker, 'click', function() { 
            infobulle.open(map, marker);
          });
        }(locations[i]));
      }
    }
    

    顺便说一句,google.maps.Marker 的选项数组末尾还有一个虚假逗号,这会在某些浏览器中导致问题。

    编辑

    如果你不想使用闭包,这是等价的:

    function processBeach(beach) {
      var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
      var infobulle = new google.maps.InfoWindow({content: beach[4], position: myLatLng});
      var marker = new google.maps.Marker({position: myLatLng, map: map, title: beach[0], zIndex: beach[3], clickable: true, icon: beach[5]}))
      google.maps.event.addListener(marker, 'click', function() { 
        infobulle.open(map, marker);
      });
    }
    
    function setMarkers(map, locations) {
      for (var i = 0; i < locations.length; i++) {
        processBeach(locations[i]);
      }
    }
    

    【讨论】:

    • 嗯,我真的不明白你对海滩功能做了什么。
    • 是的,闭包需要一些时间才能让你明白。我正在做的是一次性定义和调用一个函数。所以我定义了一个匿名函数,它接受一个名为beach 的参数,然后调用它,将locations[i] 的值作为参数传递。所以在闭包内部,beach 具有从locations[i] 传入的值,用于当前迭代的值i。正如您的代码中发生的那样,值泄漏没有问题,因为beach 仅存在于闭包内,重要的是for 循环的每次迭代都有一个不同的变量。跨度>
    • 我刚刚更新了答案以包含一个没有闭包的版本。
    • 我明白了!我试过你的代码(我已经编辑了一点,我把它放在帖子里)。地图还可以,但是没有标记了……
    • 哦,哎呀,出现复制粘贴错误。我正在创建 Marker 对象,但没有将其分配给任何东西。答案已更新。
    【解决方案2】:

    看看我的jSFiddle here。您缺少的代码是

    1. 点击时,您需要从地图中获取当前的 infoWindow,然后使用新信息对其进行更新
    2. 如果您想让窗口在人们想要关闭时保持打开和关闭,那么您必须设置一种切换类型的变量,以便在单击时创建每个窗口,然后当有人单击关闭时它会消失。但我认为你只需要完成第一部分。

    您应该在我的小提琴中查看的代码是从第 120 行到第 150 行,它会检查 infowindow 是否存在,然后在新标记上打开相同的窗口,以便它从旧标记移动到新标记。如果您继续创建新窗口,旧窗口将不会神奇地关闭。

    var map = $(this).gmap3("get"),
          infowindow = $(this).gmap3({get:{name:"infowindow"}}); // Get current info window
        if (infowindow){ // if infoWindow is there then use it else create new
          infowindow.open(map, marker);
          infowindow.setContent(context.data.ht);
          jQuery("#customPopup").html(context.data.ht);
            jQuery("#customPopup").show(500);
        } else {
          $(this).gmap3({
            infowindow:{
              anchor:marker, 
              options:{content: context.data.ht}
    
            }
          });
            jQuery("#customPopup").html(context.data.ht);
            jQuery("#customPopup").show(500);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多