Google Map Infowindow Закрытие? - PullRequest
       20

Google Map Infowindow Закрытие?

1 голос
/ 06 марта 2011

как часть моего коллажного события last.fm/google maps, я должен динамически наносить маркеры из API last.fm на карту Google.

Это все хорошо, но когда я нажимаю на маркер, толькопоследнее информационное окно (для одного концерта) отображается.Я знаю причины этого, но изо всех сил стараюсь его реализовать.

В настоящее время я запускаю цикл PHP через все местоположения (координаты) динамического концерта, а затем передаю его в javascript.Это имеет больше смысла для меня - и мои знания PHP намного лучше, чем JS:

<?php 

            foreach ($gigs->events->event as $js_event) { 

            $lat = $js_event->venue->location->children("geo",true)->point->children("geo",true)->lat;
            $long = $js_event->venue->location->children("geo",true)->point->children("geo",true)->long;
            $coords = "$lat,$long"; 

            ?>      

            var image = new google.maps.MarkerImage('http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=G|00CC99|000000',
            new google.maps.Size(40, 32),
            // The origin for this image is 0,0.
            new google.maps.Point(0,0),
            // The anchor for this image is the base of the flagpole at 0,32.
            new google.maps.Point(0, 32));

                    var marker = new google.maps.Marker({

                      position: new google.maps.LatLng(<?php echo $coords ?>),
                      map: map,
                      icon:image, 
                      title: '<?php echo str_replace('\'','',$js_event->title) ." at ". str_replace('\'','',$js_event->venue->name) ?>'

                    });

                    var contentString = '<?php echo str_replace('\'','',$js_event->title) ." at ". str_replace('\'','',$js_event->venue->name)?>'

                    var infowindow = new google.maps.InfoWindow({
                        content: contentString
                    });

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

                <? } ?>

Как я могу добавить замыкание без полного рефакторинга циклов в JS, а не в PHP и т.д.единственные решения?

Большое, большое спасибо.

1 Ответ

1 голос
/ 06 марта 2011

Простой способ изолировать область действия вашей переменной marker - заключить вызов в анонимную функцию:

var map = ...

(function() {
    var image = ...
    var marker = ...
    ...
    google.maps.event.addListener(marker, 'click', function() {
        infowindow.open(map, marker);
    });
})();

Как описано здесь , анонимная функция увидитчто-нибудь в области, где это было объявлено.Так что внутри функции можно увидеть map, которая была в области видимости, когда она была объявлена.Но вне функции marker невидим, поэтому повторяющиеся клоны анонимной функции не будут влиять друг на друга.

...