2013-04-05 4 views
2

Im перекручивание и размещение некоторых маркеров, но когда я нажимаю на маркер, все они отвечают тем же значениемGoogle Maps несколько маркеров clickevent

Вот мой код

for(a=0; a < prod.length; a++){  
    // we add marker to map 
    var myLatlng = new google.maps.LatLng(prod[a]['lat'],prod[a]['lon']); 
    var marker = new google.maps.Marker({ 
    position: myLatlng, 
    map: map, 
    title: prod[a]['name']+" \n"+prod[a]['description'], 
    icon: image 
    });   
    google.maps.event.addListener(marker, "click", function() { 
    show_details(a); 
    });  
} 

функция show_details, всегда имеет то же значение

Я посмотрел на другие ответы здесь, но это не решило мою проблему.

ответ

10

Типичная проблема в асинхронном программировании/сценарии. Переменная переменной a, когда выполняется событие клика, поэтому значение этого является результатом завершения цикла for. Вы должны создать область внутренней функции и сохранить значение a в переменной, которая живет только в этой области. Решение:

(function(z){ 
    google.maps.event.addListener(marker, "click", function() { 
     show_details(z); 
    });  
})(a); 

В a переменная живет за пределами функции обратного вызова тоже. Поэтому, если вы изменяете значение a (или цикл for), и когда вызывается обработчик событий, он видит измененный a.

Ссылка для справки: http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/.

+0

спасибо, так логично, но я полностью его не замечал. – Grumpy

Смежные вопросы