Ответ 1
Поскольку вы, кажется, используете что-то вроде jQuery, у вас может быть такая же проблема, с которой я работал, когда jQuery считает, что загрузка script завершена до того, как Карты Google на самом деле полностью "собраны". Используя jQuery $.getScript
(эквивалентно $.ajax
с dataType: "script"
, используемым здесь), он показывает, что части API карт еще недоступны обратные вызовы success
/done
.
$(function() {
var doSomethingMapRelatedInvolvingJQuery = function(geocoder, map) { ... };
$.ajax({
url: "https://maps.googleapis.com/maps/api/js?v=3&sensor=false",
dataType: "script"
}).done(function() {
var geocoder = new google.maps.Geocoder(), // ERROR!
activityMap = new google.maps.Map($("#map_canvas")[0], {
center: new google.maps.LatLng(0, 0),
zoom: 0,
mapTypeId: google.maps.MapTypeId.SATELLITE
});
doSomethingMapRelatedInvolvingJQuery(geocoder, map);
});
});
По какой-то причине, хотя jQuery говорит, что script уже выполнен, выполнив обратные вызовы, части API Карт Google еще недоступны (возможно, дополнительные асинхронные вещи от Google после завершения первого файла).
Единственное решение, которое я смог найти, - объявить глобальное имя переменной для хранения функции, которую Google Maps будет отвечать за вызов, когда она будет полностью готова. Вы можете передать это управление, добавив параметр callback={yourfunctionname}
querystring к URL-адресу (например, https://maps.googleapis.com/maps/api/js?v=3&callback=googleMapsCallback&sensor=false
). Это не самое красивое решение, но оно работает.
var googleMapsCallback;
$(function() {
var doSomethingMapRelatedInvolvingJQuery= function(geocoder, map) { ... };
googleMapsCallback = function() {
var geocoder = new google.maps.Geocoder(), // Works when google makes the call.
activityMap = new google.maps.Map($("#map_canvas")[0], {
center: new google.maps.LatLng(0, 0),
zoom: 0,
mapTypeId: google.maps.MapTypeId.SATELLITE
});
doSomethingMapRelatedInvolvingJQuery(geocoder, map);
};
$.ajax({
url: "https://maps.googleapis.com/maps/api/js?v=3&callback=googleMapsCallback&sensor=false",
dataType: "script"
});
});
EDIT:
Я собрал доказательство концепции jsFiddle, который вытаскивает все это уродство в метод расширенного jQuery, который позволяет отложить цепочку. Вот краткий пример того, как его можно использовать:
$.loadGoogleMaps().done(function () {
var geocoder = new google.maps.Geocoder();
// ... do stuff with your geocoder here ...
});