Подтвердить что ты не робот

Не удается запустить google.maps.Geocoder

Я не понимаю, почему, но я получаю эту ошибку, когда пытаюсь инициализировать google.maps.Geocoder.

Вот ошибка:

Uncaught TypeError: undefined is not a function

И код:

function updateMapPosition(map){
    var geocoder = new google.maps.Geocoder(); //crashes here !!
    var position = geocoder.geocode( {'address':$('#id_address').val()},
        function(results,status){
            if(status == google.maps.GeocoderStatus.OK){
                if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
                    map.setCenter(results[0].geometry.location);
                    var marker = new google.maps.Marker({map:map, position:results[0].geometry.location});
                }
                else{
                    alert("hop")
                }
            }
        }
    )
}
4b9b3361

Ответ 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 ...
});

Ответ 2

Если вы используете Google AJAX API Loader для загрузки API Карт Google, вы должны явно указать, использует ли ваше приложение датчик, иначе вы не получите объект Geocoder.

google.load('maps','3.6',{other_params:'sensor=false'});

Ответ 3

Мне кажется, что Geocoder не определен, следовательно, ошибка, которая Undefined is not a function. Тем не менее, google.maps определен или вы получили ошибку, которая не была определена до того, как Geocoder был разрешен.

Вам нужно будет проверить, как вы загружаете API карт, потому что он, похоже, не загружен правильно.

Ответ 4

Я решил свою проблему, это было из-за плохого URL-адреса href в теге script для библиотеки Карт:

<script src="http://maps.google.com/maps/api/js?v=3.6&sensor=false&key=XXXX" ....