请帮我解决这个问题。我有以下代码与工作地址变量。我尝试向Infowindow添加标题,以便当用户点击地图上的标记以查看弹出窗口中的某些内容时。不幸的是,对于所有弹出窗口,我可以看到相同的标题。我测试过,它是一个正确的js数组,但只显示来自数组的第一个标题..请帮助解决这个问题..提前谢谢你们!
<script type="text/javascript" charset="utf-8">
var map;
var address = < ? php echo json_encode($adr); ? > ;
var titles = < ? php echo json_encode($ttl); ? > ;
var x = 0;
var nbAddresses = address.length;
var geocoder;
var mark;
var contentString = titles[x];
function init() {
var moptions = {
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("map"), moptions);
geocoder = new google.maps.Geocoder();
for (var i = 0; i < nbAddresses; i++) {
geocoder.geocode({
'address': address[i]
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
mark = new google.maps.Marker({
position: results[0].geometry.location,
map: map,
title: titles[x]
});
map.setCenter(results[0].geometry.location);
x++;
setInfoWindow();
}
});
}
function setInfoWindow() {
google.maps.event.addListener(mark, 'click', function(event) {
var iwindow = new google.maps.InfoWindow();
iwindow.setContent(contentString);
iwindow.open(map, this);
});
}
}
window.onload = init;
</script>
答案 0 :(得分:0)
改变
X ++;
setInfoWindow();到
setInfoWindow();
x++;
sets the problem !
答案 1 :(得分:0)
在程序开始时,将contentString设置为标题数组中的第一个元素
var contentString = titles[x];
然后在setInfoWindow函数中使用此变量不变。
如果您将setInfoWindow更改为接受如此
的contentString参数,该怎么办?function setInfoWindow(contentString) {...
当你调用setInfoWindow时,传入标题。
setInfoWindow(title[x]);
确保在调用此函数后递增x,因此将x ++移到setInfoWindow调用之下。
编辑您还会不时发现一个奇怪的问题,其中某些标题可能出现在错误的标记上。这是因为您一次执行多个地理编码,并且可能无法获得响应。
以下修改将解决这个问题。
for (var i = 0; i < nbAddresses; i++) {
geocoder.geocode({
'address': address[i]
}, return function(x) { // we define a function and call it straight away. The function returns another function which is our callback.
function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
mark = new google.maps.Marker({
position: results[0].geometry.location,
map: map,
title: titles[x]
});
map.setCenter(results[0].geometry.location);
setInfoWindow();
}
}
}(i)); // (i) after the function declaration calls the function and passes in the current value of i
}
所以基本上我们在这里做的是定义一个函数并直接运行它,当前传入的值为'i'。然后函数将返回另一个函数。一旦goecoding完成,将运行此功能。但是现在我们在定义函数时引用了'i'。所以你不再需要在这个函数之外保留x的记录,因为x将等于i,它对应于传入地理编码器的地址。