嗨我在使用JavaScript的数组中遇到了一些麻烦。我们来看看:
var Villes = [
['Versailles+France', 'upr2.png'],
['Paris+France', 'upr5.png'],
['Bruxelle+Belgique', 'upr4.png'],
['Manchester+Angleterre', 'upr1.png'],
['Monaco+Monaco', 'upr3.png']
];
function initialize() {
var mapOptions = {
zoom: 5,
center: new google.maps.LatLng(46.225453,2.219238),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
var geocoder = new google.maps.Geocoder();
for (var i = 0; i < Villes.length; i++) {
var ville = Villes[i];
geocoder.geocode( { 'address': ville[0]}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
alert(ville[1] + status);
} else {
alert("Geocode n'a pas fonctionner. Erreur: " + status);
}
});
}
}
我的地图附带了我的所有标记,但图标永远不会改变,如ville[1]
是对upr3.png
的静态调用我不习惯JS,这是我第一次看到它。
答案 0 :(得分:1)
当您调用geocode
的回调时,i
的值为循环结束。
通常的通用解决方案是通过立即调用的函数表达式来保护它:
for (var i = 0; i < Villes.length; i++) {
(function(ville){
geocoder.geocode( { 'address': ville[0]}, function(results, status)
...
});
})(Villes[i]);
}
由于变量的范围是声明它的函数,这使得新变量ville
不受循环变化的影响。
答案 1 :(得分:0)
问题是ville
不是数组,因此在for循环结束时,ville
只有初始数组中最后一项的值(png3)。您需要在将值设置为ville
答案 2 :(得分:0)
geocode
调用是异步的,这意味着您将遍历所有位置并发送请求,然后响应将到达。那时你已经完成了循环,ville
变量的值是最后一个。
在循环中的代码周围放置一个函数表达式,以便每次迭代都有自己的变量副本:
for (var i = 0; i < Villes.length; i++) {
(function(ville){
geocoder.geocode( { 'address': ville[0]}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
alert(ville[1] + status);
} else {
alert("Geocode n'a pas fonctionner. Erreur: " + status);
}
});
})(Villes[i]);
}