Cambia icona marcatore al clic usando il volantino


20

Ho una mappa con molti (> 100) marcatori su di essa. Vorrei farlo in modo che facendo clic su questi si cambi l'icona in una versione evidenziata. Ho creato due icone personalizzate, una normale e una evidenziata. Ho ottenuto che funzioni con singoli marcatori, ma non riesco a trovare alcun modo per configurarlo, quindi ogni icona può essere cambiata facendo clic su di essa.

Ecco il codice di lavoro per un'icona:

var testmarker = L.marker([44.0, -73.0], {icon: unselectedIcon});

testmarker.on('click', function(e) {
  testmarker.setIcon(selectedIcon);
});

Tuttavia ho molti marker e utilizzo un ciclo for per posizionarli:

//points is a 2 dim array with lat/long pairs
for (i = 0; i <= points.length-1; i++) {
    var marker = L.marker([points[i][0], points[i][1]], {icon: unselectedIcon});    
}

marker.on('click', function(e) {
  marker.setIcon(selectedIcon);
});

Ho provato a dare a ciascun marcatore un nome di variabile univoco usando un array:

for (i = 0; i <= points.length-1; i++) {
    testmarker[i] = L.marker([points[i][0], points[i][1]], {icon: unselectedIcon}); 
    testmarker[i].on('click', function(e) {
alert(e.latlng); e.setIcon(selectedIcon); 
}); 
}

Il che mi dà solo "indefinito" nell'avviso.

Passare testmarker[i].ona this.map.ondà solo un avviso quando si fa clic sulla mappa (nessuna modifica dell'icona).

Cambiando l'intera riga in:

testmarker[i].on('click', function(e) {
alert(e.latlng); testmarker[i].setIcon(selectedIcon);
});

Cambia l'ultimo (quando si fa clic su uno), fornendo anche un avviso indefinito.

Come posso impostare i marker in modo che ciascuno possa essere modificato individualmente con un clic, ma senza usare centinaia di blocchi di codice ripetuti per ognuno?

Risposte:


16

Ho finito per risolvere questo. Ho anche capito che puoi aggiungere opzioni arbitrarie e accedervi in ​​seguito. Ciò è utile per assegnare ID univoci ai marker:

for (i = 0; i <= points.length-1; i++) {
    testmarker[i] = L.marker([points[i][0], points[i][1]], {icon: unselectedIcon, id: i}); 
    testmarker[i].on('click', function(e) {
        e.target.setIcon(selectedIcon);
        document.getElementById('someDiv').innerHTML = points[e.target.options.id][2];
}); 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.