2011-10-19 28 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); 
}