Я пытаюсь реализовать маркеры на моей карте Google на моей странице с помощью названий городов и стран в файле XML. К сожалению, похоже, что я не могу получить глобальный массив (countryList), содержащий объекты страны, чтобы они оставались заполненными вне синтаксического анализатора XML. Используя предупреждение в анализаторе, я вижу, что он содержит 35 элементов, но за его пределами 0. Я ищу некоторое понимание, но я думаю, что это связано с порядком, в котором эти функции загружаются. . Из-за того, что в массиве нет никаких элементов, нет городов, которыми можно было бы заполнить маркеры карты.

<script type="text/javascript">


$(document).ready(function() {
    $.ajax({
      type: "GET",
      url: "countries.xml",
      dataType: "xml",
      success: parseXML
    });  
});
var countryList = [];
    function parseXML(xml) {
        $(xml).find("country").each(function() {
            var name = $(this).find("name").text();
            var capital = $(this).find("capital").text();


            countryList.push(new CountryObject(name, capital));

        });
        //alert(countryList.length);        this shows a count of 35`enter code here`
}

//alert(countryList.length);    this shows a count of 0

function CountryObject(name, capital) {
    this.name = name;
    this.capital = capital; 
}


var geocoder;
var map;
var markersArray = [];
var bounds;
var infowindow =  new google.maps.InfoWindow({
    content: ''
});

//plot initial point using geocode instead of coordinates (works just fine)
function initialize() {

    geocoder = new google.maps.Geocoder();
    bounds = new google.maps.LatLngBounds ();

    var myOptions = {
        zoom: 4, 
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        navigationControlOptions: {
            style: google.maps.NavigationControlStyle.SMALL
        }
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    geocoder.geocode( { 'address': 'Toronto Canada'}, function(results, status) { 
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);

            marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });

            bounds.extend(results[0].geometry.location);

            markersArray.push(marker);
        }
        else{
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
    plotMarkers();
}

var locationsArray = [];

for (var j = 0; j < countryList.Length; j++) {
    var loc = countryList[j].capital + ' ' + countryList[j].name;
        locationsArray[j] = [countryList[j].capital, loc];
}


function plotMarkers(){
    var i;
    for(i = 0; i < locationsArray.length; i++){
        codeAddresses(locationsArray[i]);
    }
}

function codeAddresses(address){
    geocoder.geocode( { 'address': address[1]}, function(results, status) { 
        if (status == google.maps.GeocoderStatus.OK) {
            marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });

            google.maps.event.addListener(marker, 'click', function() {
                infowindow.setContent(address[0]);
                infowindow.open(map, this);
            });

            bounds.extend(results[0].geometry.location);

            markersArray.push(marker); 
        }
        else{
            alert("Geocode was not successful for the following reason: " + status);
        }

        map.fitBounds(bounds);
    });
}

google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>

<body onload="initialize()">

Изменить: я хочу заполнить маркеры с помощью locationArray, используя информацию, собранную в массиве countryList (вместо жесткого кодирования значений, которые используются в большинстве примеров в Интернете). Однако я не совсем понимаю, что мне не хватает, чтобы сохранить список страны заполненным, и я не слишком знаком с синхронным и асинхронным, кроме того, что я нашел на SO.

0
user2124002 6 Авг 2013 в 18:49
Можете ли вы лучше сформулировать свой вопрос? Отредактируйте сообщение и добавьте в конец вопрос, который поможет другим дать вам хороший ответ.
 – 
Gidil
6 Авг 2013 в 19:07
Какова длина вашего файла country.xml? Геокодирование всех этих адресов на лету может привести к превышению квоты геокодера и / или ограничения скорости. Вероятно, вы можете надежно геокодировать около 10 местоположений при загрузке страницы, не превышая лимит запросов, но это будет зависеть от нагрузки на серверы Google. Вы должны включить координаты в свой XML.
 – 
geocodezip
7 Авг 2013 в 07:45

1 ответ

Лучший ответ

Вызов ajax является асинхронным, вам нужно использовать данные внутри процедуры обратного вызова, где они доступны.

0
geocodezip 6 Авг 2013 в 19:22