2009-08-02 12 views
6

Je travaille sur une page qui récupère du code avec un httpObject Javascript et l'utilise pour mettre à jour deux éléments sur la page - une carte google, et un DIV qui liste les choses sur lesquelles le marqueur pointe .Ajout dynamique d'écouteurs aux marqueurs Google Maps

Ce bit fonctionne très bien. Le problème est que lorsque je crée les marqueurs, je le fais par une boucle for, et j'ajoute des écouteurs au marqueur dans chaque boucle. Ensuite, quand je teste la page, je trouve que la même chose se produit pour chaque marqueur. Si vous passez la souris sur un marqueur, vous devez modifier la couleur de la bordure du bit correspondant de la DIV. Au lieu de cela, chaque marqueur change la bordure du dernier bit. Il semble que chaque fois que j'ajoute les écouteurs, j'écrase aussi les écouteurs des marqueurs précédemment ajoutés.

Je comprends que cela a à voir avec l'API Google Maps qui conserve l'identité d'un marqueur même lorsque vous en créez un nouveau en Javascript. Ce que je ne comprends pas comment la contourner - j'essayé de créer un tableau en dehors de la boucle, et le changement

var newMarker = new GMarker(newLatLng); 

avec newMarker [count] = new GMarker (newLatLng);

mais cela ne fonctionne toujours pas.

Aidez-moi, StackOverflow. Tu es mon seul espoir. :)

Edit: Un peu plus de code

for (count=0;count<=LatArray.length;count++) 
{ 
    thisLat = LatArray[count]; 
    thisLong = LongArray[count]; 
    thisHTML = HTMLArray[count]; 
    newLatLng = new GLatLng(thisLat, thisLong, true); 

    if (mapBounds.containsLatLng(newLatLng)) 
    { 
     //alert(count); 
     var dinnerNumber = "dinner_"+count; 
     newMarkers[count] = new GMarker(newLatLng); 
     map.addOverlay(newMarkers[count]); 
     GEvent.addListener(newMarkers[count],'mouseover',function(){document.getElementById(dinnerNumber).style.borderColor = '#000000'; 
    }); 
}// for 
+1

+1 pour faire référence à Star Wars (le non-ordures un) – karim79

+0

Pouvons-nous avoir un plus grand échantillon de code s'il vous plaît? Il est très difficile de dire quel est le problème. – karim79

Répondre

6

question de fermeture - tous les auditeurs partagent la même variable dinnerNumber. Essayez ceci:

GEvent.addListener(newMarkers[count], 'mouseover', (function(dinnerNumber){ return function(){document.getElementById(dinnerNumber).style.borderColor = '#000000';}; })(dinnerNumber)); 

De cette manière, chaque écouteur est créé avec sa propre copie fermée de dinnerNumber.

+0

Merci Justin! Je n'ai pas la moindre idée de ce qui se passe à la fin, mais ça fonctionne. Je vais le démonter et voir si je peux le comprendre, mais pour l'instant vous avez résolu mon problème! –

+1

Découvrez http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ pour une très bonne explication des fermetures et du "problème de boucle infâme". –

1

Vous devez lire attentivement

GEvent.addListener(newMarkers[count], 'mouseover', 
     (function(dinnerNumber) 
      { return function() 
       { document.getElementById(dinnerNumber).style.borderColor = '#000000';};   
      } 
    )(dinnerNumber) 
); 

vous avez manqué un();

le paramètre 3-ème est (function (var) {fonction de retour() {// ce que vous voulez wirh var;};}) (var)

Questions connexes