2009-12-03 2 views
2

Je suis en train de créer une carte Google qui contient les emplacements de divers centres de test dans mon pays. Il trace un marqueur sur chaque comté, et lorsque vous cliquez sur le marqueur de comté, il fait un zoom avant et donne un aperçu des centres de test dans ce comté. J'utilise aussi jQuery avec ça.Google Maps: Event Listener ne se souvient que de la valeur finale de la variable

Voici le problème:

Quand je tracer les marqueurs de comté et cliquez sur eux, il effectue un zoom toujours le dernier comté. Le code que je utilise pour tracer les comtés se présente comme suit:

function plotCountyMarkers(county_count) 
{ 
    // Setup a new icon 
    var icon = new GIcon(); 
    var count = 0; 

    // Get the type of icon to display 
    var centre_type = checkCentreType(); 
    if (centre_type == 'dtc') 
     icon.image = dtc_icon; 
    else 
     icon.image = ctc_icon; 

    // Other settings including icon shadow 
    icon.shadow = icon_shadow; 
    icon.iconSize = new GSize(20, 29); 
    icon.shadowSize = new GSize(38, 29); 
    icon.iconAnchor = new GPoint(10, 29); 
    icon.infoWindowAnchor = new GPoint(10, 1); 

    // Get the total number of counties to map 
    var count = county_count.length; 

    for (key in county_count) { 
     // Set the LatLong of the county 
     var countyLocation = new GLatLng(county_locations[key][0],county_locations[key][1]); 
     // Set the title text of the marker 
     var centre_text = county_count[key]==1 ? 'Centre' : 'Centres'; 
     var title = county_locations[key][2]+': '+county_count[key]+' Test '+centre_text; 
     // Add an event listener to the marker 
     var marker = new GMarker(countyLocation,{icon: icon, title: title}); 

     GEvent.addListener(marker, "click", function() { 
      // Zoom to county 
      showCounty(key); 
     }); 

     // Add the marker to the map 
     map.addOverlay(marker); 
    } 
} 

J'utilise essentiellement la même méthode exacte pour passer HTML dans un écouteur d'événement lorsque vous cliquez sur les marqueurs de niveau du comté, et qui fonctionne très bien . Pour une raison quelconque, key est toujours la valeur du comté final. J'ai essayé de passer en key en tant que variable à la fonction, mais elle devient juste égale à la longitude et à la latitude de la pile de carte actuelle. Peut-être que je suis en train de faire quelque chose d'idiot?

Ce ne serait pas la première fois :) Toute aide serait grandement appréciée.

+0

Voir http://stackoverflow.com/questions/1331769/ http://stackoverflow.com/questions/1451009/javascript -infamous-loop-problem http://stackoverflow.com/questions/341723/event-handlers-inside-a-javascript-loop-need-a-closure http://stackoverflow.com/questions/1734749/ http://stackoverflow.com/questions/643542/ –

+0

Aussi, utilisez 'for', pas' for..in' lors de l'itération de 'county_count'. –

Répondre

4

Cheers, j'ai changé le gestionnaire d'événements pour ce qui suit et cela a fonctionné:

GEvent.addListener(marker, "click", 
    (function(key) { 
     return function() { 
      // Zoom to county 
      showCounty(key); 
     }; 
    })(key) 
); 
+1

Un bon! Vous avez lu certains de ces liens que j'ai publiés? –

Questions connexes