Javascript循环-第二个变量未显示
代码如下:Javascript循环-第二个变量未显示,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,代码如下: <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[
<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>
var\u位置=[
[“10010”,“xxxxx”,3],
[“10001”,“xxxxx”,2],
[“10002”,“zzzzz”,1]
];
对于(i=0;i
这是输出:
1) 10010-zzzzz2) 10001-zzzzz
3) 10002-zzzzz
正如您所看到的,var address输出正确的值,但是*var icon\u img*总是重复相同的值 我是一个Javascript初学者,我已经尝试了所有我能想到的方法,但我仍然得到同样的结果 另外,我已经将完整的脚本粘贴到这里:
<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>
var\u位置=[
[“10010”,“incriber_icon.png”,3],
[“10001”,“incriber_icon.png”,2],
[“10002”,“visitor\u icon.png”,1]
];
变量myOptions={
缩放:10,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
var map=new google.maps.map(document.getElementById(“map”),myOptions);
var latlng=新的google.maps.latlng(0,0);
对于(i=0;i
这个脚本中的标记都是@正确的邮政编码,但它们都显示相同的图标(visitor_icon.png) 问题在于您正在循环中创建函数。JavaScript只有函数作用域,没有块作用域。也就是说,在循环中创建的变量在整个函数中只存在一次,只是每次迭代的值都会发生变化 在计算
图标img
时(在传递给地理编码的回调中),外部for循环已经完成,图标img
具有上一次迭代的值。它适用于地址
,因为它是在循环内部计算的,而不是在以后
您必须“捕获”图标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
}
(i=0;i
var infowindow=new google.maps.infowindow(),
geocoder_map=新的google.maps.geocoder(),
地址=犯罪地点[i][0],
icon_img=违规者位置[i][1];
(function(addr,img){/问题在于您正在循环中创建一个函数。JavaScript只有函数作用域,而不是块作用域。也就是说,您在循环中创建的变量在整个函数中只存在一次,只是每次迭代的值都会更改
在计算图标img
时(在传递给地理编码的回调中),外部for循环已经完成,并且图标img
具有上一次迭代的值。它适用于地址
,因为它是在循环内部计算的,而不是稍后
您必须“捕获”图标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
}
(i=0;i
var infowindow=new google.maps.infowindow(),
geocoder_map=新的google.maps.geocoder(),
地址=犯罪地点[i][0],
icon_img=违规者位置[i][1];
(功能(地址、img){//它对我有效……请显示您的输出。尝试使用简单警报框弹出值。您确定吗?对我来说,它不会这样做,并且按照预期工作:它在Firefox中也适用于我,您在哪里打印上述代码?我刚刚单独测试了代码,它确实有效。但是,在我的完整代码中,脚本不起作用。我猜问题一定出在其他地方。我已经在上面的帖子中包含了完整的脚本!谢谢大家!看看这个..工作正常:它对我有效…请给我看一下你的输出。试着用简单的警告框弹出值。你确定吗?对我来说,它没有这样做,并且按预期工作:它在Firefox中也对我有效,你在哪里打印我n以上代码?我刚刚单独测试了代码,它确实可以工作。但是,在我的完整代码中,脚本不起作用。我想问题一定出在其他地方。我已经在上面的帖子中包含了完整的脚本!谢谢大家!检查一下……工作正常:澄清一下(因为OP是JS noob):创建函数时,它捕获对创建函数时作用域中所有变量的引用。在原始代码中,即使您正在为循环中的每个迭代创建一个新的回调函数,它们都引用了icon_img持有的相同值,在调用这些回调时,icon_img最终会返回b不管最后设置的值是什么('zzzzz')。谢谢Felix和broofa!我会更改代码,如果我成功了,会告诉你们:)但是现在不应该有问题!@user668190:它做了一些进一步的更改。例如,我认为在分配点击处理程序时,您不需要立即使用函数。但是试试看……嗨,费利克斯,我刚刚将您的代码复制到我的代码中,目前效果非常好!我现在将再次查看并寻求一些改进在整个脚本中。再次感谢您的时间!如果您不介意的话,还有一件事:)我不确定,但以防您知道谷歌地图api