2010-02-24 6 views
3

마커를 클릭하면 permalink URL로 리디렉션되도록 Listener 이벤트를 생성 된 각 마커에 추가하려고합니다. 아래 코드를 사용하면 permalink 값이 모든 마커에서 동일합니다 (마지막 값을 얻음). 나는 폐쇄 문제에 대해 읽었으며 그것이 내가 가진 것처럼 보인다. 나는 실제로 내가 본 예제를 얻지 못했다.리스너 및 Google지도 아이콘 닫기 문제

누군가 내 코드를보고 올바른 방향으로 나를 가리킬 수 있습니까? 어떤 도움이라도 대단히 감사합니다!

downloadUrl("http://localhost/map/generatexml.php", function(data) { 
      var xml = parseXml(data); 
      var markers = xml.documentElement.getElementsByTagName("marker"); 
      for (var i = 0; i < markers.length; i++) { 
       var permalink = markers[i].getAttribute("permalink"); 
       var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")), 
        parseFloat(markers[i].getAttribute("lng"))); 
       var marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name}); 
       google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;}); 
      } 
+3

이이 중 하나입니다 루프를 포함하는 클로저에 관한 가장 일반적인 반복적 인 질문, 가능한 속임수 : http://stackoverflow.com/questions/1734749 http://stackoverflow.com/questions/643542 http://stackoverflow.com/questions/1582634 http : // http://stackoverflow.com/questions/1331769 om/questions/1552941 http://stackoverflow.com/questions/750486 http://stackoverflow.com/questions/933343 http://stackoverflow.com/questions/1579978 http://stackoverflow.com/questions/1413916 http://stackoverflow.com/questions/2314175 – CMS

+0

다른 폐쇄 질문을해도 죄송합니다. 이전 답변을 살펴 보았지만 제대로 작동하지 않았습니다. 링크를 가져 주셔서 감사합니다! –

답변

11

에 대한 설명이 시도 :

for (var i = 0; i < markers.length; ++i) { 
    // ... like what you have already ... 
    (function(permalink) { 
    google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;}); 
    })(permalink); 
} 

를 각 반복에서 "영구 링크"값의 사본과 함께 새로운 어휘 범위를함으로써, 당신의 핸들러가 작동합니다 보다 나은.

+0

왜 나는 그렇게 간단한 해결책을 생각해 내는데 어려움을 겪고 있었습니까? 나는 질투심이 많다. – Bob

+0

감사합니다. Pointy, 나는 이것을 몇 시간 동안 일하도록 노력해 왔습니다. 귀하의 코드가 작동하고 당신은 내 영웅입니다! –

2

자바 스크립트는 기능 범위를 가지고, 그래서 당신은 중간에 VAR의를 선언하고 때를 위해 루프 만 전체 기능에 대해 한 번을 선언하는 사실입니다. 당신이해야 할 첫 번째 일이 무엇인지를 좀 더 이해하게 해주는 가기 VAR 선언을 모두 가져다 일이야 :

downloadUrl("http://localhost/map/generatexml.php", function(data) { 
      var xml = parseXml(data); 
      var markers = xml.documentElement.getElementsByTagName("marker"); 
      var i, permalink, point, marker; 
      for (i = 0; i < markers.length; i++) { 
       permalink = markers[i].getAttribute("permalink"); 
       point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")), 
        parseFloat(markers[i].getAttribute("lng"))); 
       marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name}); 
       google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;}); 
      } 

귀하의 클릭 기능은 모든 마커 이벤트에 대한 영구 링크의 마지막 값을 사용합니다 퍼머 교체됩니다 이후 for 루프 루프 때마다 새로운 값을 사용합니다.

편집 : 그렇습니다. 그렇기 때문에, Pointy는 실제로 당신의 문제를 해결하기 위해 나를 때려 눕혔습니다. 그러나 거기에 당신이, 적어도 문제

+0

나를 도와 주셔서 감사합니다 밥, 당신은 끝내줍니다 :) –

1

우리는 작업 예제를 참조 보려면

function AddInfoWidnow(marker,message) 
{ 
    var infowindow = new google.maps.InfoWindow({ content: message }); 

    google.maps.event.addListener(marker, 'click', function() { 

    infowindow.open(marker.get('map'), marker); 

    }); 

} 

를 마커 정보 창을 추가하려면이 문제

사용을 아래의 코드를 해결하기 위해 클로저를 사용할 필요가 here

관련 문제