2011-10-19 26 views
0

我一直在使用這樣的:google maps marker as link api v3與多標記鏈接谷歌地圖API

我得到的是所有在我的地圖上的標記具有相同的鏈接 所以我改變了一下,沒有任何幫助

代碼

我正在努力的主要事情是,在第一個循環var i是介於0到n之間,但在geocoder.gercode函數內它始終是n值(頂部值),而不是從0到因此我的鏈接永遠是最後一個

var AllPlaces = new Array(); 
var address = [<%=LocationStr%>]; 
var links = [<%=LinkStr%>]; 
var dolinks = (links.length == 0) ? false : true; 
var MaxAddress = address.length; 
var ThisLink; 
var Markers = new Array(); 
var Mj = 0; 
var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    for (var i = 0; i < MaxAddress; i++) { 
     ThisLink = ""; 
     Mj = i; 
     if (dolinks) { 
      ThisLink = links[i]; 
     } 
     geocoder.geocode({ 'address': address[i]}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       AllPlaces.push(results[0].geometry.location); 
       if (MaxAddress == 1) { 
        map.setCenter(results[0].geometry.location); 
       } 
       else { 
        DoCenter(AllPlaces,map); 
       } 
       Markers[i] = new google.maps.Marker({ 
        map: map, 
        url: ThisLink, 
        position: results[0].geometry.location 
       }); 
       alert(Mj); 
       if (dolinks) { 
        google.maps.event.addListener(Markers[i], 'click', function() { 
         window.location.href = Markers[i].url; 
        }); 
       } 
      } 
     }); 
    } 
    var latlng = new google.maps.LatLng(); 
    var myOptions = { 
     zoom: <%=ZoomStr%>, 
     mapTypeControl: false, 
     streetViewControl: false, 
     panControl: false, 
     zoomControl: true, 
     scaleControl: false, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("<%=DivID%>"), myOptions); 
    } 

    function DoCenter(LL,obj) { 
     if (LL.length < MaxAddress) return; 
     var bounds = new google.maps.LatLngBounds(); 
     for (var i = 0, LtLgLen = LL.length; i < LtLgLen; i++) { 
      bounds.extend (LL[i]); 
     } 
     obj.fitBounds (bounds); 
} 

回答

0

只是爲了澄清是什麼問題。你的是增加,但你知道這是一個活的。即而你在循環中的價值也在變化。因此,例如:

var arr = []; 
for(var i=0; i<5; i++) { 
    var func = function() { 
     console.log(i); 
    } 
    arr.push(func); 
} 

for(var j=0; j<5; j++) { 
    arr[j](); 
} 

上面的代碼的結果是:

5 
5 
5 
5 
5 

的解決方案是創建一個匿名函數,並立即把它叫做:

var arr = []; 
for(var i=0; i<5; i++) { 
    var func = function(index) { 
     return function() { 
      console.log(index); 
     } 
    }(i); 
    arr.push(func); 
} 
for(var j=0; j<5; j++) { 
    arr[j](); 
} 
+0

能否請您進一步解釋關於它? –

+0

你給出的例子有錯誤 –

+0

是的,抱歉,我只是糾正了我的代碼。我得走了。但是當我回來時,會對這種方法增加額外的評論。 – Krasimir

0

geocoder.geocode異步運行。您的for循環可能會在第一次地理編碼回調執行之前完成。創建一個新的函數來關聯每個鏈接。 注意:每個函數都在新的上下文中運行。 修改代碼:

var AllPlaces = new Array(); 
var address = [<%=LocationStr%>]; 
var links = [<%=LinkStr%>]; 
var dolinks = (links.length == 0) ? false : true; 
var MaxAddress = address.length; 
var ThisLink; 
var Markers = new Array(); 
var Mj = 0; 
var geocoder; 
function reversGeoCord(address, ThisLink){ 

    geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       AllPlaces.push(results[0].geometry.location); 
       if (MaxAddress == 1) { 
        map.setCenter(results[0].geometry.location); 
       } 
       else { 
        DoCenter(AllPlaces,map); 
       } 
       Markers[i] = new google.maps.Marker({ 
        map: map, 
        url: ThisLink, 
        position: results[0].geometry.location 
       }); 
       alert(Mj); 
       if (dolinks) { 
        google.maps.event.addListener(Markers[i], 'click', function() { 
         window.location.href = Markers[i].url; 
        }); 
       } 
      } 
     }); 
} 
function initialize() { 

    for (var i = 0; i < MaxAddress; i++) { 
     ThisLink = ""; 
     Mj = i; 
     if (dolinks) { 
      ThisLink = links[i]; 
     } 
     reversGeoCord(address[i], ThisLink ); 
    } 
    var latlng = new google.maps.LatLng(); 
    var myOptions = { 
     zoom: <%=ZoomStr%>, 
     mapTypeControl: false, 
     streetViewControl: false, 
     panControl: false, 
     zoomControl: true, 
     scaleControl: false, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("<%=DivID%>"), myOptions); 
    } 

    function DoCenter(LL,obj) { 
     if (LL.length < MaxAddress) return; 
     var bounds = new google.maps.LatLngBounds(); 
     for (var i = 0, LtLgLen = LL.length; i < LtLgLen; i++) { 
      bounds.extend (LL[i]); 
     } 
     obj.fitBounds (bounds); 
}