2009-08-02 8 views
6

Sto lavorando a una pagina che recupera il codice con un httpObject Javascript e lo utilizza per aggiornare due elementi sulla pagina: una mappa di google e un DIV che elenca le cose a cui punta il marcatore .Aggiunta dinamica di ascoltatori a Google Maps Markers

Questo bit funziona correttamente. Il problema è che quando creo i marker, lo faccio attraverso un ciclo for, e aggiungo listener al marker in ogni ciclo. Poi, quando provo la pagina, trovo la stessa cosa che succede per ogni marcatore.

Il passaggio del mouse su un marker deve modificare il colore del bordo del bit corrispondente del DIV. Invece, ogni marcatore cambia il bordo dell'ultimo bit. Sembra che ogni volta che aggiungo gli ascoltatori sovrascrivo anche gli ascoltatori degli indicatori aggiunti in precedenza.

Ho capito che questo ha a che fare con l'API di Google Maps mantenendo l'identità di un marcatore anche quando ne crei uno nuovo in Javascript. Quello che non capisco come ottenere intorno ad esso - Ho cercato di creare una matrice di fuori del ciclo, e cambiando

var newMarker = new GMarker(newLatLng); 

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

ma ancora non funziona.

Help Me, StackOverflow. Sei la mia unica speranza. :)

Edit: Un po 'più di codice

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 per fare riferimento a Star Wars (il non-rifiuti uno) – karim79

+0

Possiamo avere un campione di codice più grande per favore? È molto difficile dire qual è il problema. – karim79

risposta

6

problema di chiusura - tutti quegli ascoltatori condividono la stessa variabile dinnerNumber. Prova questo:

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

In questo modo, ogni ascoltatore viene creato con la propria copia chiusa di dinnerNumber.

+0

Grazie Justin! Non ho idea di cosa stia succedendo alla fine, ma funziona. Lo farò a pezzi e vedrò se riesco a capirlo, ma per ora hai risolto il mio problema! –

+1

Dai un'occhiata a http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ per un'ottima spiegazione delle chiusure e del "famigerato problema del loop". –

1

si deve leggere attentamente

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

vi siete persi uno();

il parametro 3-rd è (function (var) {funzione di ritorno() {// ciò che si vuole wirh var;};}) (var)

Problemi correlati