JavaScript & Google Maps v3: захватить результат события tileloaded ()? - PullRequest
1 голос
/ 12 января 2011

У меня проблема с асинхронной природой Javascript и Google Maps. Я добавляю некоторые маркеры на карту с помощью прослушивателя Google Maps V3 tilesloaded.

Я не знаю, как достать эти маркеры, чтобы потом что-то с ними делать, потому что плитка загружается асинхронно, и я новичок в Javascript!

Вот код:

function show_place () {
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    var marker = addMarker(lat, lng);
    markers.push(marker);
    // When the map boundaries move, add new markers within the bounds.
    google.maps.event.addListener(map, 'tilesloaded', function() {
      var bounds = map.getBounds();
      $.getJSON("/markers_within_bounds/", { [variables] }, function(json){
        for (i=0;i<json.length;i++) {
              var map_marker = addMarker(json[i].lat, json[i].lng);
                  markers.push(map_marker); //Try to add markers to the array. Fail.
        }
      });
    });
    return markers;
}
$(document).ready(function() {
    var markers = show_place(lat, lng);
    alert(markers.length);
    // Do things with the markers... if there is more than 1. 
});

Предупреждение всегда показывает 1, потому что show_place возвращается ДО того, как загрузит все маркеры. Я не могу достать дополнительные маркеры, которые были добавлены.

Как мне обойти это?

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Вы должны сделать это так:

var marker = new google.maps.Marker({
    position: point,
    title: 'mytitle'
});
marker.setMap(myMap);
markersArray.push(marker);
0 голосов
/ 08 июля 2011

1- Я думаю, что вы можете сделать общедоступную переменную вместо того, чтобы возвращать значение из вашей функции.2- Пожалуйста, проверьте внутри консоли Firebug, чтобы увидеть, есть ли проблемы.3 - вместо использования загруженных плиток, вы можете использовать idle или bounds_changed (лучше избегать, так как Google вызывает это событие много раз)

var markerList = [];
function (data){//AJAX CALLBACK FUNCTION
  //EMPTY THE LIST & CLEAR THE MARKER FROM MAP
  for (var i = 0; i < markerList.length; i++) {
    markerList[i].setMap();
  };
  markerList.length = 0;
  markerList[i] = new google.maps.Marker({
    map: map,
    position: new google.maps.LatLng(data[i].geo_latitude, data[i].geo_longitude),
    title: data[i].fn
  });
};
0 голосов
/ 14 апреля 2011

Возможно, у вас уже есть маркеры в переменной, но когда вы запрашиваете длину в

$(document).ready(function ...)

длина всегда будет одна (1), потому что вы вставили маркер, внутренняя функция срабатывает только после того, как плитки были загружены все время, пока show_place () завершил выполнение. Ваш show_place () не должен ничего возвращать. Однако, если вы хотите предупредить пользователя о том, что вы загрузили данные, вы должны поместить код во внутреннюю функцию «Обратный вызов» или вызвать объявленную функцию в функциональном блоке обратного вызова.

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