【问题标题】:Google Maps API Multiple Markers with Infowindows带有 Infowindows 的 Google Maps API 多个标记
【发布时间】:2012-06-21 19:53:50
【问题描述】:

我正在尝试添加多个标记,每个标记都有自己的信息窗口,点击时会出现。我无法启动信息窗口,当我尝试它时,要么只显示一个没有信息窗口的标记。

谢谢,如果您需要更多信息,请告诉我

<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<style type="text/css">
html {
    height: 100%
}

body {
    height: 100%;
    margin: 0;
    padding: 0
}

#map_canvas {
    height: 100%
}
</style>
<script type="text/javascript"
    src="http://maps.googleapis.com/maps/api/js?key=AIzaSyB1tbIAqN0XqcgTR1-FxYoVTVq6Is6lD98&sensor=false">
</script>
<script type="text/javascript">

var locations = [
    ['loan 1', 33.890542, 151.274856, 'address 1'],
    ['loan 2', 33.923036, 151.259052, 'address 2'],
    ['loan 3', 34.028249, 151.157507, 'address 3'],
    ['loan 4', 33.80010128657071, 151.28747820854187, 'address 4'],
    ['loan 5', 33.950198, 151.259302, 'address 5']
];

function initialize() {

    var myOptions = {
        center: new google.maps.LatLng(33.890542, 151.274856),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP

    };
    var map = new google.maps.Map(document.getElementById("default"),
        myOptions);

    setMarkers(map, locations)
}


function setMarkers(map, locations) {

    var marker, i
    for (i = 0; i < locations.length; i++) {

        var loan = locations[i][0]
        var lat = locations[i][1]
        var long = locations[i][2]
        var add = locations[i][3]

        latlngset = new google.maps.LatLng(lat, long);

        var marker = new google.maps.Marker({
            map: map, title: loan, position: latlngset
        });
        map.setCenter(marker.getPosition())

        var content = "Loan Number: " + loan + '</h3>' + "Address: " + add

        var infowindow = new google.maps.InfoWindow()

        google.maps.AddListener(marker, 'click', function (map, marker) {
            infowindow.setContent(content)
            infowindow.open(map, marker)
        });
    }
}


</script>
</head>
<body onload="initialize()">
<div id="default" style="width:100%; height:100%"></div>
</body>
</html>

【问题讨论】:

  • 只使用一个在标记之前创建的信息窗口。然后每个标记的点击事件将正常工作。事件侦听器中的变量content 未在该函数中定义。
  • 作为一个快速注释,如果你的代码格式正确,它会更容易阅读。
  • @paullb 我会重新格式化它,我在 4 年前写过这个问题,那时我还是个新手 :)

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


【解决方案1】:

你可以使用闭包。只需像这样修改您的代码:

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

这里是DEMO

【讨论】:

  • 我得到了这个工作,但是我将如何更改代码,以便当我单击另一个标记时,它会打开一个信息窗口,替换以前打开的信息窗口,而不是每次单击时不断打开更多信息窗口在另一个标记上?
  • 它有效!但是有人可以向我解释为什么它会这样工作吗?
  • @Lakshay 你可以阅读类似的问题here
  • 这种情况下,在地图外点击应该如何关闭信息窗口?
  • 如何关闭信息窗口? infowindow.close() 不工作。
【解决方案2】:

这里是代码 sn-p 肯定会工作。您可以访问下面的link 了解如何使用 jsFiddle 和详细解释。 How to locate multiple addresses on google maps with perfect zoom

var infowindow = new google.maps.InfoWindow();  
google.maps.event.addListener(marker, 'mouseover', (function(marker) {  
           return function() {  
               var content = address;  
               infowindow.setContent(content);  
               infowindow.open(map, marker);  
           }  
         })(marker));  

【讨论】:

    【解决方案3】:

    来源Link

    演示Link

    以下代码将显示 带有 InfoWindow 的多个标记。您也可以取消注释代码以在 悬停 上显示信息

                var map;
                var InforObj = [];
                var centerCords = {
                    lat: -25.344,
                    lng: 131.036
                };
                var markersOnMap = [{
                        placeName: "Australia (Uluru)",
                        LatLng: [{
                            lat: -25.344,
                            lng: 131.036
                        }]
                    },
                    {
                        placeName: "Australia (Melbourne)",
                        LatLng: [{
                            lat: -37.852086,
                            lng: 504.985963
                        }]
                    },
                    {
                        placeName: "Australia (Canberra)",
                        LatLng: [{
                            lat: -35.299085,
                            lng: 509.109615
                        }]
                    },
                    {
                        placeName: "Australia (Gold Coast)",
                        LatLng: [{
                            lat: -28.013044,
                            lng: 513.425586
                        }]
                    },
                    {
                        placeName: "Australia (Perth)",
                        LatLng: [{
                            lat: -31.951994,
                            lng: 475.858081
                        }]
                    }
                ];
    
                window.onload = function () {
                    initMap();
                };
    
                function addMarkerInfo() {
                    for (var i = 0; i < markersOnMap.length; i++) {
                        var contentString = '<div id="content"><h1>' + markersOnMap[i].placeName +
                            '</h1><p>Lorem ipsum dolor sit amet, vix mutat posse suscipit id, vel ea tantas omittam detraxit.</p></div>';
    
                        const marker = new google.maps.Marker({
                            position: markersOnMap[i].LatLng[0],
                            map: map
                        });
    
                        const infowindow = new google.maps.InfoWindow({
                            content: contentString,
                            maxWidth: 200
                        });
    
                        marker.addListener('click', function () {
                            closeOtherInfo();
                            infowindow.open(marker.get('map'), marker);
                            InforObj[0] = infowindow;
                        });
                        // marker.addListener('mouseover', function () {
                        //     closeOtherInfo();
                        //     infowindow.open(marker.get('map'), marker);
                        //     InforObj[0] = infowindow;
                        // });
                        // marker.addListener('mouseout', function () {
                        //     closeOtherInfo();
                        //     infowindow.close();
                        //     InforObj[0] = infowindow;
                        // });
                    }
                }
    
                function closeOtherInfo() {
                    if (InforObj.length > 0) {
                        InforObj[0].set("marker", null);
                        InforObj[0].close();
                        InforObj.length = 0;
                    }
                }
    
                function initMap() {
                    map = new google.maps.Map(document.getElementById('map'), {
                        zoom: 4,
                        center: centerCords
                    });
                    addMarkerInfo();
                }
    

    【讨论】:

    • 此解决方案的一个要求是对信息窗口和标记使用 const,否则它不起作用..
    【解决方案4】:

    如果您还想将关闭信息窗口绑定到某个事件,请尝试这样的操作

    google.maps.event.addListener(marker,'click', (function(marker,content,infowindow){ 
        return function() {
            infowindow.setContent(content);
            infowindow.open(map,marker);
            windows.push(infowindow)
            google.maps.event.addListener(map,'click', function(){ 
                infowindow.close();
            }); 
        };
    })(marker,content,infowindow)); 
    

    【讨论】:

      【解决方案5】:
      function setMarkers(map,locations){
      
      for (var i = 0; i < locations.length; i++)
       {  
      
       var loan = locations[i][0];
       var lat = locations[i][1];
       var long = locations[i][2];
       var add =  locations[i][3];
      
       latlngset = new google.maps.LatLng(lat, long);
      
       var marker = new google.maps.Marker({  
                map: map, title: loan , position: latlngset  
       });
       map.setCenter(marker.getPosition());
      
      
       marker.content = "<h3>Loan Number: " + loan +  '</h3>' + "Address: " + add;
      
      
       google.maps.events.addListener(marker,'click', function(map,marker){
                map.infowindow.setContent(marker.content);
                map.infowindow.open(map,marker);
      
       });
      
       }
      }
      

      然后将var infowindow = new google.maps.InfoWindow()移动到initialize()函数:

      function initialize() {
      
          var myOptions = {
            center: new google.maps.LatLng(33.890542, 151.274856),
            zoom: 8,
            mapTypeId: google.maps.MapTypeId.ROADMAP
      
          };
          var map = new google.maps.Map(document.getElementById("default"),
              myOptions);
          map.infowindow = new google.maps.InfoWindow();
      
          setMarkers(map,locations)
      
        }
      

      【讨论】:

      • google.maps.events.AddListener 应该是google.maps.event.addListener
      • 如果我在我的 initialize() 函数中包含var infowindow = new google.maps.InfoWindow();,我会得到TypeError: map.infowindow is undefined
      猜你喜欢
      • 2015-05-02
      • 2018-09-06
      • 1970-01-01
      • 2015-11-10
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多