当前位置: 首页 > 知识库问答 >
问题:

谷歌地图上有多个不同的信息窗口

姚德容
2023-03-14

我想为谷歌地图上的每个标记创建一个自己的窗口。我尝试了这个:

// Create first marker and window
marker = new google.maps.Marker({
  position: myLatlng,
  map: map
});
contentString = '<div>BOX A</div>';
var infowindow = new google.maps.InfoWindow({
  content: contentString
});
marker.addListener('click', function() {
  infowindow.open(map, marker);
});

// Create second marker and window
myLatlng = new google.maps.LatLng(12.1364,-86.2514);
marker = new google.maps.Marker({
  position: myLatlng,
  map: map
});
contentString = '<div>BOX B</div>';
infowindow = new google.maps.InfoWindow({
  content: contentString
});
marker.addListener('click', function() {
  infowindow.open(map, marker);
});

不幸的是,只有第二个标记有一个包含Box B的窗口。如果我单击第一个标记,那么带有Box B的第二个标记的窗口就会弹出。我不明白为什么会发生这种情况。

我注意到,如果我为第二个标记和第二个窗口使用一个新变量,每个标记都有自己的窗口,如下所示:

              // Create sceond marker and window
              myLatlng = new google.maps.LatLng(12.1364,-86.2514);
              marker2 = new google.maps.Marker({
                position: myLatlng,
                map: map
              });
              contentString = '<div>BOX B</div>';
              infowindow2 = new google.maps.InfoWindow({
                content: contentString
              });
              marker2.addListener('click', function() {
                infowindow2.open(map, marker2);
              });

但我完全不明白为什么我需要使用新的变量。为什么我不能覆盖旧的变量?

注意:这个问题是关于如何获取多个不同的infoWindows,因此与在Google Maps API v3中只打开一个InfoWindow和Google Maps infoWindow仅在标记上加载最后一条记录不同

以下是完整的代码:

    <div id="map" style='height:300px'></div>
           <script>
             function initMap() {

              // init map
              var mapDiv = document.getElementById('map');
              myLatlng = new google.maps.LatLng(52.4955,13.3437);
              var map = new google.maps.Map(mapDiv, {
                scrollwheel: false,
                center: myLatlng,
                zoom: 1
              });

              var myLatlng, marker, infowindow,contentString;

              // Create first marker and window
              marker = new google.maps.Marker({
                position: myLatlng,
                map: map
              });
              contentString = '<div>BOX A</div>';
              var infowindow = new google.maps.InfoWindow({
                content: contentString
              });
              marker.addListener('click', function() {
                infowindow.open(map, marker);
              });

              // Create second marker and window
              myLatlng = new google.maps.LatLng(12.1364,-86.2514);
              marker = new google.maps.Marker({
                position: myLatlng,
                map: map
              });
              contentString = '<div>BOX B</div>';
              infowindow = new google.maps.InfoWindow({
                content: contentString
              });
              marker.addListener('click', function() {
                infowindow.open(map, marker);
              });
             }
             </script>

共有1个答案

韩照
2023-03-14

当您的第一个标记单击处理程序时

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

调用时,您的infowindow变量指向创建的第二个infowindow,因为您对两个infowindow使用相同的变量:

var infowindow = new google.maps.InfoWindow(..
infowindow = new google.maps.InfoWindow({

SO这里有这样的问题,这个和这个讨论同一个问题。乍一看可能不是同一个问题,但你的问题是范围。

您的问题可以通过使用两个不同的变量轻松解决,或者更好地创建一个可重用的函数:

       <script>

         function addMarkerWithInfowindow(map, marker_position, infowindow_content){
              var myLatlng, marker, infowindow,contentString;
              marker = new google.maps.Marker({
                  position: marker_position,
                  map: map
              });
              contentString = infowindow_content;
              infowindow = new google.maps.InfoWindow({
                  content: contentString
              });
              marker.addListener('click', function() {
                 infowindow.open(map, marker);
              });
         }

         function initMap() {

          // init map
          var mapDiv = document.getElementById('map');
          myLatlng = new google.maps.LatLng(52.4955,13.3437);
          var map = new google.maps.Map(mapDiv, {
            scrollwheel: false,
            center: myLatlng,
            zoom: 1
          });


          addMarkerWithInfowindow(map, new google.maps.LatLng(52.4955,13.3437), '<div>BOX A</div>');
          addMarkerWithInfowindow(map, new google.maps.LatLng(12.1364,-86.2514), '<div>BOX B</div>');

         }
         </script>

现在处理程序中的变量:

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

与函数的范围相关,因此将始终指向正确的信息窗口实例。我建议您阅读更多关于javascript作用域的内容来理解这个问题,在我链接到一些关于这个问题的好文章的问题答案中有一些链接(例如这篇或这篇)。

 类似资料:
  • 还有另外四个if语句,它们对其他类别做同样的事情。 它会显示标记,但当我单击标记时,它会显示上次创建的标记的信息窗口。

  • 升级到NativeScript6后,在iOS上点击谷歌地图上的标记以显示相关信息窗口,应用程序就会崩溃。这是由于_layoutrootview被删除-请参见https://github.com/dapriett/nativescript-google-maps-sdk/issues/354 问题是没有提供任何替代方案,google-maps-sdk插件最近也没有任何活动。 按照@manoj的指示,

  • 我正在尝试自定义信息窗口,并在加载地图时显示它。自定义信息窗口出现了,但是,除了默认的信息窗口背景(白色)之外,我还没有为出现的标记设置图标?为什么我会得到这个默认值? 以下是我尝试的内容的屏幕截图: 我不想要白色窗口和标记图标?我正在尝试实现以下截图:如何使用Android map API v2创建自定义形状的位图标记 以下是我正在尝试的:

  • 我想创建一个谷歌地图标记列表,这些标记填充关于这些特定位置的信息窗口,并在信息窗口内链接到维基百科关于该位置的文章。我在这个单击函数中进行Ajax调用,并且这个函数在一个

  • 我正在用VueJS在Laravel 5.7中构建一个应用程序。我有一个谷歌地图(使用vue2谷歌地图构建),有200个标记,每个标记都有一个信息窗口。我想在infoWindow中包含一个路由器链接,但由于该链接是作为字符串传递的,所以Vue似乎没有对其进行解析。 这是我目前的组件-除了路由器链接,所有的工作 有人能建议一种方法来解析路由器链接吗? 谢谢你