API карт Google v3, маркер, на который нажимают, не может быть - PullRequest
1 голос
/ 07 марта 2012

Я получаю из моего webAPI массив json-объектов пользователей. Я могу правильно отобразить маркер для каждого пользователя в своем местоположении, но я не могу приступить к работе, когда нажимаю на каждого из них, чтобы получить выбранный элемент, я всегда получаю информацию от последнего в списке.

Это код, который я использую, чтобы поместить их на карту:

var markers = [];

for ( var i = 0; i < size; i++) {
    var zIndex = membersList[i].type; 
    var latLng = new google.maps.LatLng(membersList[i].latitude,
            membersList[i].longitude);
    var marker = new google.maps.Marker({
        'position' : latLng,
        'shadow' : null,
        'zIndex' : zIndex,
        'title'  : membersList[i].username,
        'id'     : i,
        'icon' : markerImage[membersList[i].type]
    });

    google.maps.event.addListener(marker, 'click', function()
    {
        console.log(marker.id);
        var clicked = membersList[marker.id];
        var mType = ['', 'Couple', 'Male', 'Female'];
        var textType = mType[clicked.type];
        var userName = clicked.username;
        $(this).simpledialog2({
            mode: 'button',
            headerText: "OPTIONS",
            headerClose: true,
            buttonPrompt:  userName+ ' ('+textType+')',
            buttons : {
                'PROFILE': {
                    click: function () {
                        toUser = userName;
                        loadPage('profile');
                    },
                    icon: "info"
                },
                'MESSAGE': {
                    click: function () { 
                        toUser = userName;
                        loadPage('compose');
                    },
                    icon: "star",
                }
            }
        });
    });

    markers.push(marker);
}

markerCluster.addMarkers(markers);

Кстати, я использую markerClusterer для отображения маркеров, сгруппированных на карте, при некоторых уровнях масштабирования.

Ответы [ 2 ]

2 голосов
/ 30 января 2017

Никогда не поздно, поэтому, если я правильно понял, это подход, к которому будет подходить.

При создании маркеров добавьте их в массив после завершения их индивидуальной настройки.

var MySiteWithMap = { 
    markersArray : [], //Markers array
    map : {}, //Map object instance
    init : function() {

       var mapCanvas = document.getElementById("map");
       var mapOptions = {
         center : new google.maps.LatLng(-26.816667, -65.216667),
         zoom : 11
       };
       this.map = new google.maps.Map(mapCanvas,mapOptions);

       /*
       The following is used to get the Lat and Lng where the user clicks. 
       It may be useful to store the last coordinate where the user clicked.
       */
       this.map.addListener("click", function(event){
          var lat = event.latLng.lat();
          var lng = event.latLng.lng();
          console.log("Lat: "  + lat + "  Lng: "  +  lng);
       });

       MySiteWithMap.initMarkers();

    },
    initMarkers : function(url){
         $.get(url).done(function(result){
            var lat;
            var lng;
            $.each(result,function(index,element){
               lat = element.Latitud;
               lng = element.Longitud;

               var position = new google.maps.LatLng(lat,lng);

               var marker = new google.maps.Marker({
                   position : position,
                   map : _this.map,
                   id : element.id //Supposing it's a primary key from the DB or some other unique id.
               });
               marker.addListener('click',function(){
                   console.log(this.id)
               });

               Mapas.markersArray[marker.id] = marker; 
        })
    }
}

Таким образом, у вас есть массив объектов Marker.Если вы хотите получить ссылку на конкретный экземпляр маркера, вы можете получить идентификатор выбранного маркера и найти его в «markersArray».

Если вы хотите получить позицию (илилюбые другие свойства) маркера, вы можете сделать что-то вроде этого:

console.log(MySiteWithMap.markersArray[123].position)

Надеюсь, это поможет!

2 голосов
/ 07 марта 2012

вы используете маркер, который определен вне функции клика.

вам нужно взглянуть на API Google Maps и узнать, как получить идентификатор кликаемого маркера

маркер увеличивается в цикле и ВСЕГДА будет последним созданным маркером

...