Сведения о вопросе

Life

17:50, 2nd October, 2020

Теги

JavaScript   jQuery   Google   Maps    

Асинхронная загрузка XML и Google Maps в jQuery

Просмотров: 393   Ответов: 4

Ситуация: загружаются XML-файл и карты Гугла, чтобы данные из XML на ней отобразить. Делается всё асинхронно, требуется отследить, когда оба запроса выполнены.
Единственный простой способ, который я нашёл — Deferred objects в jQuery.
Пишем
function loadXML() {
return $.ajax({ url: 'data.xml', dataType: 'xml' });
}


Возвращаемый объект засовываем в $.when
$.when( loadXML(), ... ).then(function(){
doSomethind();
});


Проблемы возникают с загрузкой карты. Гугл предлагает следующий код для асинхронной загрузки:
function loadScript() {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize";
document.body.appendChild(script);
}


Хочется знать, когда скрипт будет загружен и произойдёт обращение к initialize(). Первая мысль — запихать в initialize() ручное создание deferred-объекта и возвращать .promise(), но непонятно, что же добавить в $.when, чтобы тот сработал после того, как все методы API карт стали доступны.

Спасибо.



  Сведения об ответе

9090

17:17, 28th September, 2020

Решение:

коротко — при загрузке карты руками создать deferred-объект, задать при загрузке карты callback'ом его resolve()

полностью:

function loadXML() {
    return $.ajax({ url: 'data.xml', dataType: 'xml' });
}

function loadMap() {
    dfd = $.Deferred();
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=finishMapLoading";
    document.body.appendChild(script);
    return dfd.promise();
}

function finishMapLoading() {
    dfd.resolve();
}

function loadData() {
    var LMap = loadMap();
    var LXML = loadCoupons();
    $.when( LMap, LXML ).then( function() {
        doSomethingAwesome();
    });
}

window.onload = function() {
    loadData();
}


  Сведения об ответе

P_S_S

17:25, 30th September, 2020

Для jquery есть волшебный плагин последовательных запросов. Тобишь пока не обработается первый. второй не будет отправлен.

code.google.com/p/jquery-ajaxq/


  Сведения об ответе

SILA

12:01, 26th September, 2020

И кстати… а что вам мешает в событие success ajax запроса вставить вашу функцию loadScript? таким образом она будет вызвана когда данные уже прийдут + они могут быть переданы как параметр функции


  Сведения об ответе

PAGE

20:12, 25th September, 2020

<script type="text/javascript" src="http://google.com/jsapi"></script>
<script>
var map;
google.load("maps", "3", {"callback" : mapsLoaded, "other_params" : "sensor=false"});
function mapsLoaded() {
var myOptions = {
    zoom: 5,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
}
</script>

А еще у Гугла можно KML (KMZ) грузить, вместо xml:
var markersKML = new google.maps.KmlLayer('http://your-site.com/points.kmz', {'map' : map, preserveViewport : true });


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться