Domanda

Sto lavorando a una pagina che recupera il codice con un oggetto http JavaScript e lo utilizza per aggiornare due elementi sulla pagina: una mappa di Google e un DIV che elenca le cose a cui punta l'indicatore.

Quel bit funziona bene. Il problema è che quando creo i marker, lo faccio attraverso un ciclo for e aggiungo listener al marker in ciascun loop. Quindi, quando provo la pagina, trovo che succeda la stessa cosa per ogni marker.

Passare il mouse sopra un marcatore dovrebbe cambiare 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 precedentemente aggiunti.

Ho capito che questo ha a che fare con l'API di Google Maps che conserva l'identità di un marcatore anche quando ne crei uno nuovo in Javascript. Cosa non capisco come aggirarlo: ho provato a creare un array al di fuori del ciclo e modificando

var newMarker = new GMarker(newLatLng);

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

ma non funziona ancora.

Aiutami, StackOverflow. Sei la mia unica speranza. :)

Modifica: 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
È stato utile?

Soluzione

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.

Altri suggerimenti

Devi leggere attentamente

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

ne hai perso uno ();

il terzo parametro è (function (var) {return function () {// cosa vuoi con wirh var;};}) (var)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top