InfoWindow на маркере с использованием MarkerClusterer

Это мой 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>

person user846290    schedule 28.09.2011    source источник


Ответы (2)


Перед циклом for создайте пустой объект информационного окна.

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: работа с замыканиями

Итак, ваш код должен выглядеть примерно так:

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);
            });
        }
person g.adam    schedule 23.05.2012
comment
О, наконец, шаг за шагом и полный ответ. На этот раз я действительно знал, что делаю, и исправил это :) - person Martijn; 04.02.2016

Итак, что вам нужно сделать, это добавить некоторый код внутри цикла for, связывающий обработчик события onclick информационного окна с каждым маркером. Я предполагаю, что вы хотите, чтобы одновременно отображалось только одно информационное окно, т. е. вы нажимаете на маркер, появляется информационное окно с соответствующим содержимым. Если затем щелкнуть другой маркер, первое информационное окно исчезнет, ​​а новое появится снова, прикрепленное к другому маркеру. Вместо того, чтобы иметь несколько информационных окон, видимых одновременно.

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);
  });
person duncan    schedule 04.10.2011