используя значения массива javascript вне функции - PullRequest
1 голос
/ 04 мая 2011

У меня есть forloop, у которого есть вызов функции внутри него. В этой функции я помещаю значения в массив, называемый маркерами.

Есть ли способ получить доступ к значениям массива маркеров вне forloop?

Вот код:

<script type="text/javascript"> 
    // arrays to hold copies of the markers and html used by the side_bar 
    // because the function closure trick doesnt work there 
    var map = null;
    geocoder = new google.maps.Geocoder();
    var side_bar_html = ""; 
    var icon = '';
    var markers = [];

    function codeAddress(this_address,index,callback) {
        geocoder.geocode( { 'address': this_address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                callback.call(window,index,results[0].geometry.location)
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    }


    function initialize() {
        // create the map
        var myOptions = {
            zoom: 3,
            center: new google.maps.LatLng(46.90, -121.00),
            mapTypeControl: true,
            mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
            navigationControl: true,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

        google.maps.event.addListener(map, 'click', function() {
            infowindow.close();
        });


        for (var i = 0; i < businesses.length; i++) {
            codeAddress(businesses[i].address,i,function(i,point){
                var description = businesses[i].description;

                if(businesses[i].business_type == "Wine"){
                    //http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=A|00CC99|000000
                    icon = 'http://google-maps-icons.googlecode.com/files/wineyard.png';
                }else if(businesses[i].business_type == "Golf"){
                    icon = 'http://google-maps-icons.googlecode.com/files/golf.png';
                }else{
                    icon = 'http://google-maps-icons.googlecode.com/files/festival.png';
                }

                var marker = createMarker(point,businesses[i].name,description,icon);

                // put the assembled side_bar_html contents into the side_bar div
                document.getElementById("side_bar").innerHTML = side_bar_html;
            });//End codeAddress-function
        }//End for-loop

        console.log(markers);
        var markerCluster = new MarkerClusterer(map, markers);               

    }

    // A function to create the marker and set up the event window function 
    function createMarker(latlng, name, html,icon) {
        var contentString = html;
        var marker = new google.maps.Marker({
            position: latlng,
            map: map,
            icon: icon,
            zIndex: Math.round(latlng.lat()*-100000)<<5
            });

        google.maps.event.addListener(marker, 'click', function() {
            infowindow.setContent(contentString); 
            infowindow.open(map,marker);
        });

        // save the info we need to use later for the side_bar
        markers.push(marker);

        // add a line to the side_bar html
        side_bar_html += '<a href="javascript:myclick(' + (markers.length-1) + ')">' + name + '<\/a><br />'+html+'<br />';

    }

    var infowindow = new google.maps.InfoWindow({ 
        size: new google.maps.Size(150,50)
    });

    // This function picks up the click and opens the corresponding info window
    function myclick(i) {
        google.maps.event.trigger(markers[i], "click");
    }

</script>

Как видите, в последней строке написано "var markerCluster = new MarkerClusterer (map, markers);" Здесь я хочу получить доступ к информации.

Спасибо!

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Проблема в том, что вы не учитываете асинхронный характер вызова codeAddress.Вы вызываете эту функцию в цикле, который запускает серию вызовов API Карт Google.

Вы запускаете эту строку:

var markerCluster = new MarkerClusterer(map, markers);

... даже досработали обратные вызовы.

Чтобы исправить, ведите счетчик.Каждый раз, когда вызывается обратный вызов, увеличивайте этот счетчик на 1. Как только он равен businesses.length, вы знаете, что все адреса были геокодированы, и все маркеры были добавлены в массив.Теперь вы можете создать MarkerCluster.

0 голосов
/ 04 мая 2011

Вывести определение маркера за пределы цикла for ...

var markers = new Array ();
for (var i = 0; i < businesses.length; i++) {
    markers[i] = ...
0 голосов
/ 04 мая 2011

Да, объявить его перед циклом for.

var markers
for(....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...