Закрытие Javascript не работает с Google Maps V3 - PullRequest
1 голос
/ 29 августа 2010

Может, кто-нибудь посоветует мне, что я делаю не так с этим фрагментом кода?

В настоящее время я использую простой файл JSON для предоставления данных для информационных окон с помощью API карт Google V3. Мне известна концепция замыканий, но я не могу понять, почему в информационных окнах по-прежнему отображается последний результат при нажатии.

Вот мой файл JSON:

{ "markers": [
{
"lat": 51.5001524,
"lng": -0.1262362,
"firstName": "nameOne"
},
{
"lat": 55.8656274,
"lng": -4.2572227,
"firstName": "nameTwo"
},
{
"lat": 43.834526782236814,
"lng": -37.265625,
"firstName": "nameThree"
}
] }

Вот мой JS:

(function(){

function initialize() {
    var latlng = new google.maps.LatLng(51.5001524, -0.1262362)

    var myOptions = {
      zoom: 3,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.TERRAIN
    }

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

    function parseJson(){
        $.ajax({
            url: 'assets/js/markers.json',
            dataType: 'json',
            success: function(data) {
                processMarkers(data)
            }, 
            error: function (data) {
                console.log('fail')
            }
        })
    }

      function processMarkers(data){

        var totalMarkers = data.markers.length;
        for(i=0;i<totalMarkers;i++){
            var latitude = data.markers[i].lat;
            var longditude = data.markers[i].lng;
            var putMarker = new google.maps.LatLng(latitude, longditude);
            var thisMarker = new google.maps.Marker({
                  position: putMarker,
                  map: map
                });

            var firstName = data.markers[i].firstName;
            var infoWindow = new google.maps.InfoWindow({
                position: putMarker,
                content: firstName
            });

            new google.maps.event.addListener(
                thisMarker, 
                'click', 
                buildHandler(map, thisMarker));
        }

        function buildHandler(map, marker){
            return function(){
                infoWindow.open(map, marker);
            };
        }

    }

    parseJson();

  }

$(document).ready(function(){
    initialize();
});
})();

Любая помощь будет принята с благодарностью.

Приветствия

1 Ответ

1 голос
/ 29 августа 2010

infoWindow - это некоторая переменная в области действия processMarkers.Это повторяет одно и то же информационное окно снова и снова для каждого маркера, теряя его после последней итерации (и оставляя его установленным на последний маркер).Сирота не может умереть, потому что она захвачена при закрытии вашего обработчика кликов.Я недостаточно хорошо знаю API Google, чтобы предсказать, что должно произойти в .open ().Но на этом этапе infoWindow выглядит не очень хорошо ...

РЕДАКТИРОВАТЬ: На самом деле мне кажется, что каждое информационное окно, кроме последнего, становится жертвой сборщика мусора.Или это где-то указано?Я не могу разобрать.

РЕДАКТИРОВАТЬ: Помните, JS не имеет {} областей (например, C).Он имеет только функциональные возможности!Другими словами, просто передайте infoWndow в свой buildHandler ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...