以下是代码:
<script type="text/javascript">
var offender_locations = [
["10010", "xxxxx", 3],
["10001", "xxxxx", 2],
["10002", "zzzzz", 1]
];
for (i = 0; i < offender_locations.length; i++) {
var address = offender_locations[i][0];
var icon_img = offender_locations[i][1];
}
</script>
这是输出:
1)10010 - zzzzz
2)10001 - zzzzz
3)10002 - zzzzz
如您所见, var address 输出正确的值,但* var icon_img *始终重复相同的值。
我是一名Javascript初学者,我已经尝试了所有可以想到的方法,但我仍然得到了相同的结果。
P.S。我在这里粘贴了完整的脚本:
<script type="text/javascript">
var offender_locations = [
["10010", "offender_icon.png", 3],
["10001", "offender_icon.png", 2],
["10002", "visitor_icon.png", 1]
];
var myOptions = {
zoom: 10,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map"), myOptions);
var latlng = new google.maps.LatLng(0, 0);
for (i = 0; i < offender_locations.length; i++) {
var infowindow = new google.maps.InfoWindow();
var geocoder_map = new google.maps.Geocoder();
var address = offender_locations[i][0];
var icon_img = offender_locations[i][1];
geocoder_map.geocode({
'address': address
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: map.getCenter(),
icon: icon_img
});
google.maps.event.addListener(marker, 'click', (function (marker, i) {
return function () {
infowindow.setContent(offender_locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
} else {
alert("The requested offender is not mappable !")
};
});
}
</script>
此脚本中的标记都是@正确的邮政编码,但它们都显示相同的图标(visitor_icon.png)!
答案 0 :(得分:7)
问题是你在循环中创建一个函数。 JavaScript只有函数作用域,而不是块作用域。即您在循环中创建的变量在整个函数中只存在一次,只是每次迭代的值都会更改。
在评估icon_img
时(在传递给geocode
的回调中),外部for循环已经完成,icon_img
具有最后一次迭代的值。它适用于address
,因为它在循环内部进行评估,而不是以后。
您必须“捕获”icon_img
的当前值,您可以使用立即函数来执行此操作:
for (i = 0; i < offender_locations.length; i++) {
var infowindow = new google.maps.InfoWindow(),
geocoder_map = new google.maps.Geocoder(),
address = offender_locations[i][0],
icon_img = offender_locations[i][1];
(function(addr, img) { // <-- immediate function call
geocoder_map.geocode({'address': addr}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: map.getCenter(),
icon: img
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(addr);
infowindow.open(map, marker);
});
} else {
alert("The requested offender is not mappable !");
}
});
}(address, icon_img)); // <-- immediate function call
}
也许你会为更多的变量做这件事......不确定。