Загрузите Google Maps v3 динамически с AJAX - PullRequest
22 голосов
/ 13 октября 2010

Когда я пытаюсь загрузить Google Maps v3 с AJAX, результат:

<script src="http://maps.gstatic.com/intl/en_us/mapfiles/api-3/2/8a/main.js" type="text/javascript"></script>

в исходном коде, я полагаю, что пишет с помощью javascript document.write ();

как я могу сделать это без iframe?

спасибо.

Ответы [ 7 ]

30 голосов
/ 26 сентября 2012

Нашел практичный способ.

Здесь можно поиграть с пользовательским событием (jQuery): http://jsfiddle.net/fZqqW/94/

window.gMapsCallback = function(){
    $(window).trigger('gMapsLoaded');
}

$(document).ready((function(){
    function initialize(){
        var mapOptions = {
            zoom: 8,
            center: new google.maps.LatLng(47.3239, 5.0428),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
    }
    function loadGoogleMaps(){
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type","text/javascript");
        script_tag.setAttribute("src","http://maps.google.com/maps/api/js?sensor=false&callback=gMapsCallback");
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
    }
    $(window).bind('gMapsLoaded', initialize);
    loadGoogleMaps();
})());​

РЕДАКТИРОВАТЬ Функция loadGoogleMaps может быть болеепрактичен, если объявлен в глобальной области, особенно при работе в ajax-приложении.А логическая проверка предотвратит загрузку API несколько раз из-за навигации.

var gMapsLoaded = false;
window.gMapsCallback = function(){
    gMapsLoaded = true;
    $(window).trigger('gMapsLoaded');
}
window.loadGoogleMaps = function(){
    if(gMapsLoaded) return window.gMapsCallback();
    var script_tag = document.createElement('script');
    script_tag.setAttribute("type","text/javascript");
    script_tag.setAttribute("src","http://maps.google.com/maps/api/js?sensor=false&callback=gMapsCallback");
    (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
}

$(document).ready(function(){
    function initialize(){
        var mapOptions = {
            zoom: 8,
            center: new google.maps.LatLng(47.3239, 5.0428),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions);
    }
    $(window).bind('gMapsLoaded', initialize);
    window.loadGoogleMaps();
});
23 голосов
/ 15 октября 2010

Это не поддерживается.Пожалуйста, загрузите API, используя поддерживаемые методы:

http://code.google.com/apis/maps/documentation/javascript/tutorial.html#Loading_the_Maps_API

15 голосов
/ 05 апреля 2011

Я сделал это так ... в этом примере используются jQuery и Google Map v3.x

$.getScript("http://maps.google.com/maps/api/js?sensor=true&region=nz&async=2&callback=MapApiLoaded", function () {});

function MapApiLoaded() {
   //.... put your map setup code here: new google.maps.Map(...) etc
}
8 голосов
/ 18 декабря 2013

Вы должны использовать этот параметр 'callback = initialize' в скрипте API карт Google для загрузки с помощью ajax:

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize"></script>

Вот документация по Google Maps:

Cоmo cargar el API de forma asíncrona

5 голосов
/ 17 июня 2015

Простое и рабочее решение (с использованием jQuery):

var gMapsLoaded = false;

function loadGoogleMaps() { if(!gMapsLoaded) { $.getScript("https://maps.googleapis.com/maps/api/js?sensor=false&async=2&callback=GoogleMapsLoaded", function(){}); } else { GoogleMapsLoaded(); } }

function GoogleMapsLoaded() {

   gMapsLoaded = true;

   // your code here - init map ...
}

вставьте это в свои скрипты и затем вызовите функцию loadGoogleMaps (); , когда вам это нужно!

1 голос
/ 04 июля 2013
$LAB
  .setOptions({AlwaysPreserveOrder:true})
  .script("http://maps.google.com/maps/api/js?v=3.exp&sensor=false&async=2")
  .script("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/13/6/main.js")
  .script("script.js");

Внутри script.js инициализируйте вашу карту без метода загрузки googles, например:

Namespace.map = (function(){

    var map,
        markers = [];

    return{
        init: function(){
                var myLatlng = new google.maps.LatLng(-25.363882,131.044922),

                    mapOptions = {
                      zoom: 4,
                      center: myLatlng,
                      mapTypeId: google.maps.MapTypeId.ROADMAP
                    };

                map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

                var marker = new google.maps.Marker({
                    position: myLatlng,
                    map: map,
                    title: 'Hello World!'
                });

                markers.push(marker);
            }
    };

}());

Внутри script.js:

Namespace.map.init();

// Don't use: google.maps.event.addDomListener(window, 'load', initialize);

Примечание: не полагайтесьна этот метод, как Google меняет имя второго файла JS.Вот пример из их документации:

https://developers.google.com/maps/documentation/javascript/examples/map-simple-async

1 голос
/ 24 июля 2012

Я немного изменил сэмпл Myster, который у меня выглядит хорошо

    window.mapapiloaded = function () {
        console.log('$.ajax done: use google.maps');
        createusinggmaps();
    };

    $.ajax({
        url: 'http://maps.google.com/-maps/api/js?v=3.2&sensor=true&region=it&async=2&callback=mapapiloaded',
        dataType: 'script',
        timeout: 30000, 
        success: function () {
            console.log('$.ajax progress: waiting for mapapiloaded callback');
        },
        error: function () {
            console.log('$.ajax fail: use osm instead of google.maps');
            createusingosm();
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...