Mostra popup al passaggio del mouse, non al clic usando Leaflet?


37

In Leaflet è possibile che il popup si apra al passaggio del mouse, non al clic?

Funziona solo per un marker alla volta, ma ne ho bisogno per un numero maggiore di marker:

marker.on('mouseover', function(e){
    marker.openPopup();
});

1
Se hai due domande, ti preghiamo di aprire due discussioni in modo da poter rispondere separatamente.
underdark

Risposte:


43

Se è necessario mostrare il popup per un marker, è possibile utilizzare il metodo marker bindPopup.

Quindi hai più controllo e verrà automaticamente associato al tuo marker.

Nell'esempio seguente puoi mostrare il popup quando l'utente passa il mouse sopra e nasconderlo quando l'utente esce dal mouse:

        marker.bindPopup("Popup content");
        marker.on('mouseover', function (e) {
            this.openPopup();
        });
        marker.on('mouseout', function (e) {
            this.closePopup();
        });

Nota: è possibile che si verifichino problemi con la chiusura dei popup quando si passa con il mouse sul popup stesso, quindi potrebbe essere necessario regolare l'ancoraggio del popup in (vedere le impostazioni dei popup) per mostrare i popup un po 'più lontano dal marker stesso in modo che non scompare troppo facilmente.


4
Soluzione per mantenere visibile il popup quando ci si passa sopra con il mouse - jsfiddle.net/sowelie/3JbNY
rob-gordon

9

Questo aiuterà a mostrare il popup al passaggio del mouse marker

marker.on('mouseover', function(e) {
  //open popup;
  var popup = L.popup()
   .setLatLng(e.latlng) 
   .setContent('Popup')
   .openOn(map);
});

1
Grazie! questo codice mi ha aiutato in qualcosa di non correlato a questa domanda.
Abbafei,

6

Questo non è un problema specifico del volantino, ma piuttosto una questione di Javascript.

Conserva i tuoi marcatori in una raccolta, quindi associa openPopupun 'mouseover'evento a tutti.

Ad esempio, con un array:

var markers = getAllMarkers(); // up to you to implement, say it returns an Array<L.Marker>

for (var i = 0; i < markers.length; i++) {
    var currentMarker = markers[i];
    currentMarker.on('mouseover', currentMarker.openPopup.bind(currentMarker));
}

Opinione in un commento piuttosto che nella risposta: penso che l'usabilità dei popup aperti al passaggio del mouse su una mappa, dove per definizione il tuo cursore vaga molto, è discutibile. Vuoi davvero che i tuoi utenti eseguano l'individuazione dei percorsi tra i marcatori per raggiungere finalmente quello che vogliono, ma si nascondono sempre dietro i popup ogni volta che provano a spostare il cursore verso il bersaglio?
MattiSG,

Questa non è una mia scelta, sfortunatamente. Ho dei marker memorizzati come il nuovo L.MarkerClusterGroup con Leaflet MarkerCluster: var markers = new L.MarkerClusterGroup (); funzionerebbe anche per quel codice che hai scritto?
Counterflow

@againstflow Ehm, allora dovresti cambiare la tua domanda. Non stai solo chiedendo di aprire i marcatori al passaggio del mouse, ma stai chiedendo come scorrere i marcatori in L.MarkerClusterun'istanza ... La mia risposta mostra chiaramente come associare una raccolta di popup al passaggio del mouse. Se vuoi sapere come ottenere una raccolta da un cluster, questo è qualcos'altro.
MattiSG,


4

In termini di avere una soluzione che funziona "per un numero maggiore di marker", questo è quello che faccio per ogni livello di dati punto caricati da GeoJSON:

var layerPopup;
featureLayer.on('mouseover', function(e){
    var coordinates = e.layer.feature.geometry.coordinates;
    var swapped_coordinates = [coordinates[1], coordinates[0]];  //Swap Lat and Lng
    if (map) {
       layerPopup = L.popup()
           .setLatLng(swapped_coordinates)
           .setContent('Popup for feature #'+e.layer.feature.properties.id)
            .openOn(map);
    }
});
featureLayer.on('mouseout', function (e) {
    if (layerPopup && map) {
        map.closePopup(layerPopup);
        layerPopup = null;
    }
});

Solo curioso, che tipo di oggetto è featureLayer? Sembra che questa sia un'ottima soluzione.
Behr,
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.