Popup bei Mouse-Over anzeigen, nicht bei Klick mit Leaflet?


37

Ist es im Leaflet möglich, dass ein Popup beim Mouse-Over und nicht beim Klicken geöffnet wird?

Dies funktioniert jeweils nur für einen Marker, aber ich benötige es für eine größere Anzahl von Markern:

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

1
Wenn Sie zwei Fragen haben, öffnen Sie bitte zwei Threads, damit diese separat beantwortet werden können.
Underdunkel

Antworten:


43

Wenn Sie das Popup für einen Marker anzeigen müssen, können Sie die bindPopup-Methode für Marker verwenden.

Dann haben Sie mehr Kontrolle und es wird automatisch an Ihren Marker gebunden.

Im folgenden Beispiel können Sie das Popup-Fenster anzeigen, wenn der Benutzer mit der Maus darüber fährt, und ausblenden, wenn der Benutzer mit der Maus darüber fährt:

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

Hinweis: Möglicherweise treten Probleme beim Schließen der Popups auf, wenn Sie mit der Maus auf das Popup selbst fahren. Daher müssen Sie möglicherweise den Popup-Anker anpassen (siehe Popup-Einstellungen), damit Ihre Popups etwas weiter vom Marker selbst entfernt angezeigt werden zu leicht verschwinden.


4
Lösung, um das Popup sichtbar zu halten, wenn Sie mit der Maus darüber fahren - jsfiddle.net/sowelie/3JbNY
rob-gordon

9

Dies wird dazu beitragen, Pop-up auf Marker Mouseover anzuzeigen

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

1
Vielen Dank! Dieser Code half mir bei etwas, das nichts mit dieser Frage zu tun hatte.
Abbafei

6

Dies ist kein Flugblatt-spezifisches Problem, sondern eine Frage von Javascript.

Speichern Sie Ihre Markierungen in einer Sammlung und binden Sie openPopupsie dann 'mouseover'für alle an ein Ereignis.

Zum Beispiel mit einem 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));
}

Meinung eher in einem Kommentar als in der Antwort: Ich halte die Verwendbarkeit von Popups auf einer Karte, bei denen der Cursor per Definition viel wandert, für fragwürdig. Möchten Sie wirklich, dass Ihre Benutzer die Wegfindung zwischen den Markierungen durchführen, um endlich die gewünschte zu erreichen, die sich jedoch immer hinter Popups verbirgt, wenn sie versuchen, den Cursor auf ihr Ziel zu bewegen?
MattiSG

Dies ist leider nicht meine Wahl. Ich habe Marker wie neue L.MarkerClusterGroup mit Leaflet MarkerCluster gespeichert: var marker = new L.MarkerClusterGroup (); Würde diese Codierung, die Sie geschrieben haben, auch dafür funktionieren?
Strom

@againstflow Ähm, dann solltest du deine Frage ändern. Sie werden nicht nur gefragt, ob Marker beim Hover geöffnet werden sollen, sondern auch, wie in einer L.MarkerClusterInstanz über Marker iteriert werden soll. Meine Antwort zeigt deutlich, wie Sie eine Sammlung von Popups beim Hover binden können. Wenn Sie wissen möchten, wie Sie eine Sammlung aus einem Cluster abrufen können, ist dies etwas anderes.
MattiSG


4

In Bezug auf eine Lösung, die "für eine größere Anzahl von Markern" funktioniert, ist dies das, was ich für jede Ebene von Punktdaten mache, die von GeoJSON geladen werden:

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;
    }
});

Nur neugierig, welche Art von Objekt ist FeatureLayer? Sieht so aus, als wäre dies eine großartige Lösung.
Behr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.