1

안녕 유래 사람들,자바 스크립트 : 구글지도 마커 목록

내가 구글 맵 마커에 대한 MarkerCluster 기능을 구현하고 잘못 HREF. 매우 간단한 것처럼 보이는 문제가 발생하지만이를 추적하는 데 어려움이 있습니다.

이 스크립트는 장고 템플릿을 통과 한 json 문자열을 가져옵니다. 표시는 정상적으로 작동하지만 모든 마커의 링크는 동일합니다 (마지막 json 목록). 그러나 코드는 모든 반복과 함께 새로운 href가 만들어 질 것이라고 내게 곧장 보인다. 맞지 않아?

스크립트를 실행하면 모든 링크가 json 목록의 마지막 항목으로 리디렉션됩니다. 어떻게 해결할 수 있습니까?

var data = {{ project_data|safe }}; 
var markers = []; 
for (var i = 1; i < {{ len|safe }}; i++) { 
    var dat = data[i]; 
    var latLng = new google.maps.LatLng(dat.lat, dat.lng); 
    var marker = new google.maps.Marker({ 
     position: latLng, 
     title: dat.name, 
     }); 

    google.maps.event.addListener(marker, 'click', function() { 
     window.location.href = "../projects/" + dat.link; 
    }); 

    markers.push(marker); 
} 

당신의 도움이 & 제안을 주셔서 감사합니다.

+0

모든 클릭 핸들러가 * 동일한 * 변수에 액세스하기 때문입니다. 모든 루프 반복으로 누구의 내용을 덮어 씁니 까. – Tomalak

답변

4

난 그냥

(function(dat) { 
    google.maps.event.addListener(marker, 'click', function() { 
     window.location.href = "../projects/" + dat.link; 
    }); 
})(dat); 

이 문제를 해결할 수 있습니다 희망 다음과 같이이

google.maps.event.addListener(marker, 'click', function() { 
    window.location.href = "../projects/" + dat.link; 
}); 

교체가 변수 범위 지정 문제를 생각합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 예, 문제를 해결합니다! addListener를 캡슐화하는 이유는 무엇입니까? – neurix

+0

환영합니다! 귀하의 예제에서'var dat = data [i];'는 전역 범위에 있고 그로 인해 모든 링크에 마지막 값이 할당 된 것입니다. 나의 예에서는 closure를 사용했다. 폐쇄를 이해하려면 http://www.mennovanslooten.nl/blog/post/62 및 http://www.javascriptkit.com/javatutors/closures2.shtml을 읽어보십시오. –