开发者

Javascript Loop - 2nd variable Not Displaying

Here is the code:

<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>

This is the output:

1) 10010 - zzzzz

2) 10001 - zzzzz

3) 10002 - zzzzz

AS you can see var address outputs the correct value, but *var icon_img* does always repeat the same value.

I am a Javascript beginner and I have tried all ways I can think of but I still get the same results.

P.S. I have pasted the full script here :

<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 mapp开发者_如何转开发able !")
      };
    });
  }
</script>

The markers in this script are all @ the correct postal code, but they all show the same icon (visitor_icon.png) !


The problem is that you are creating a function in a loop. JavaScript has only function scope, not block scope. I.e. variables you create in a loop exist only once in the whole function, just the values changes per iteration.

At the time icon_img is evaluated (in the callback passed to geocode), the outer for loop already finished and icon_img has the value of the last iteration. It works for address because it is evaluated inside the loop, not later.

You have to 'capture' the current value of icon_img and you can do so by using an immediate function:

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
}

Maybe you hav to do this for even more variables... not sure.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜