【问题标题】:InfoWindow on Marker using MarkerClusterer使用 MarkerClusterer 在 Marker 上的 InfoWindow
【发布时间】:2011-11-26 17:05:15
【问题描述】:

这是我的 html 代码。我已经尝试过在标记上添加一个信息窗口,但它不想工作。我的数据是从“Alle_Ortswahlen.page1.xml”文件加载的。 有谁知道如何将 infoWindow 添加到每个标记?

<script type="text/javascript">
  google.load('maps', '3', {
    other_params: 'sensor=false'
  });
  google.setOnLoadCallback(initialize);
function initialize() {

  var stack = [];

  var center = new google.maps.LatLng(48.136, 11.586);
    var options = {
        'zoom': 5,
        'center': center,
        'mapTypeId': google.maps.MapTypeId.ROADMAP
    };
  var map = new google.maps.Map(document.getElementById("map_canvas"), options);
  GDownloadUrl("Alle_Ortswahlen.page1.xml", function(doc) {
    var xmlDoc = GXml.parse(doc);
    var markers = xmlDoc.documentElement.getElementsByTagName("ROW");
    for (var i = 0; i < markers.length; i++) {
      // obtain the attribues of each marker
      var lat = parseFloat(markers[i].getAttribute("Field4"));
      var lng = parseFloat(markers[i].getAttribute("Field6"));
      var marker = new google.maps.Marker({
            position : new google.maps.LatLng(lat, lng),
            map: map,
            title:"This is a marker"
        });     
      stack.push(marker);
    }
    var mc = new MarkerClusterer(map,stack);
  });
}
</script>

【问题讨论】:

    标签: html google-maps-markers infowindow


    【解决方案1】:

    在 for 循环之前,创建一个空的 infowindow 对象。

    var infowindow = new google.maps.InfoWindow();
    

    比在for循环中,在标记之后,添加一个事件监听器,像这样:

                google.maps.event.addListener(marker, 'click', (function(marker, i) {
                    return function() {
                        infowindow.setContent("You might put some content here from your XML");
                        infowindow.open(map, marker);
                    }
                })(marker, i));
    

    将回调参数传递给 addListener 方法时,会发生一些关闭魔术。不熟悉的可以看这里:

    Mozilla Dev Center: Working with Closures

    因此,您的代码应如下所示:

    google.load('maps', '3', {
                other_params: 'sensor=false'
            });
    
            google.setOnLoadCallback(initialize);
    
            function initialize() {
    
                var stack = [];
    
                var center = new google.maps.LatLng(48.136, 11.586);
                var options = {
                    'zoom': 5,
                    'center': center,
                    'mapTypeId': google.maps.MapTypeId.ROADMAP
                };
                var map = new google.maps.Map(document.getElementById("map_canvas"), options);
                var infowindow = new google.maps.InfoWindow();
                GDownloadUrl("Alle_Ortswahlen.page1.xml", function(doc) {
                    var xmlDoc = GXml.parse(doc);
                    var markers = xmlDoc.documentElement.getElementsByTagName("ROW");
                    for (var i = 0; i < markers.length; i++) {
                        // obtain the attribues of each marker
                        var lat = parseFloat(markers[i].getAttribute("Field4"));
                        var lng = parseFloat(markers[i].getAttribute("Field6"));
                        var marker = new google.maps.Marker({
                            position : new google.maps.LatLng(lat, lng),
                            map: map,
                            title:"This is a marker"
                        });     
                        google.maps.event.addListener(marker, 'click', (function(marker, i) {
                            return function() {
                                infowindow.setContent("You might put some content here from your XML");
                                infowindow.open(map, marker);
                            }
                        })(marker, i));
                        stack.push(marker);
                    }
                    var mc = new MarkerClusterer(map,stack);
                });
            }
    

    【讨论】:

    • 哦,终于,一步一步,一个完整的答案。这次我真的知道我在做什么,并且把它修好了:)
    【解决方案2】:

    因此,您需要在 for 循环中添加一些代码,将 infowindow onclick 事件处理程序与每个标记相关联。我假设您一次只想显示 1 个信息窗口,即您单击一个标记,信息窗口将显示相关内容。如果您随后单击另一个标记,则第一个信息窗口会消失,而新的信息窗口会重新出现在另一个标记上。而不是同时显示多个信息窗口。

    GDownloadUrl("Alle_Ortswahlen.page1.xml", function(doc) {
        var xmlDoc = GXml.parse(doc);
        var markers = xmlDoc.documentElement.getElementsByTagName("ROW");
        // just create one infowindow without any content in it
        var infowindow =  new google.maps.InfoWindow({
            content: ''
        });
        for (var i = 0; i < markers.length; i++) {
          // obtain the attribues of each marker
          var lat = parseFloat(markers[i].getAttribute("Field4"));
          var lng = parseFloat(markers[i].getAttribute("Field6"));
          var marker = new google.maps.Marker({
                position : new google.maps.LatLng(lat, lng),
                map: map,
                title:"This is a marker"
            });     
            // add an event listener for this marker
            google.maps.event.addListener(marker , 'click', function() {
            // assuming you have some content in a field called Field123
                    infowindow.setContent(markers[i].getAttribute("Field123"));
                    infowindow.open(map, this);
            });
          stack.push(marker);
        }
        var mc = new MarkerClusterer(map,stack);
      });
    

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2018-03-17
      • 2012-05-11
      • 2018-08-03
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多