Відображення спливаючого вікна при натисканні миші, а не натисканням кнопки Leaflet


37

Чи можливо в Leaflet спливаюче вікно відкриватися при переході миші, а не при натисканні?

Це працює лише для одного маркера за один раз, але мені це потрібно для більшої кількості маркерів:

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

1
Якщо у вас є два питання, відкрийте дві теми, щоб на них можна було відповісти окремо.
underdark

Відповіді:


43

Якщо вам потрібно показати спливаюче вікно для маркера, ви можете використовувати маркери bindPopup метод.

Тоді ви маєте більше контролю, і він автоматично буде прив’язаний до вашого маркера.

У наведеному нижче прикладі ви можете показати спливаюче вікно, коли користувач перемикає мишу, і приховати його, коли користувач вимкне миші:

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

Примітка. Ви можете зіткнутися з проблемами із закриттям спливаючих вікон, коли ви клацаєте мишкою на сам спливаюче вікно, тому вам може знадобитися відкоригувати якір для спливаючих вікон (див. Параметри спливаючих вікон), щоб показати спливаючі вікна трохи далі від самого маркера, щоб він не став занадто легко зникають.


4
Рішення для збереження спливаючого вікна при натисканні
rob-

9

Це допоможе показати спливаюче вікно на миші

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

1
Спасибі! цей код допоміг мені в чомусь не пов'язаному з цим питанням.
Аббафей

6

Це не специфічна для Leaflet проблема, а скоріше питання Javascript.

Зберігайте маркери в колекції, а потім прив'язуйте їх openPopupдо 'mouseover'події для всіх.

Наприклад, з масивом:

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

Думка в коментарі, а не у відповідь: Я вважаю, що зручність відкритих вказівників на карті, де за визначенням ваш курсор багато блукає, сумнівна. Ви дійсно хочете, щоб ваші користувачі виконували пошук маршрутів між маркерами, щоб нарешті досягти потрібного, але завжди ховаються за спливаючими вікнами, коли вони намагаються перемістити курсор до своєї цілі?
MattiSG

На жаль, це не мій вибір. У мене маркери зберігаються як новий L.MarkerClusterGroup з Leaflet MarkerCluster: var markers = new L.MarkerClusterGroup (); це кодування, яке ви написали, теж працювало для цього?
проти потоку

@againstflow Erm, тоді слід змінити своє запитання. Ви не тільки просите відкрити маркери на наведення курсора, ви запитуєте, як перебрати маркери в L.MarkerClusterекземплярі ... Моя відповідь чітко показує, як пов’язати колекцію спливаючих вікон на наведення курсора. Якщо ви хочете знати, як отримати колекцію з кластеру, це щось інше.
MattiSG

6

Якщо ви використовуєте Leaflet 1.3.x, прив'язка підказок - це вбудований метод.

http://leafletjs.com/reference-1.3.0.html#tooltip

var polyline = L.polyline([[StartLat, StartLong],[EndLat,EndLong]]).addTo(this.map);
    polyline.bindTooltip("tool tip is bound");

1
Фантастичний. Повністю уникає описаного вище тремтіння "mouseover" / "mouseout".
Нік К9

bindTooltip()працює і на окремих маркерах.
С. Баггі

4

Що стосується рішення, яке працює "для більшої кількості маркерів", це я роблю для кожного шару точкових даних, завантажених з 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;
    }
});

Просто цікаво, який тип об'єкта є функцією Layer? Схоже, це чудове рішення.
Бехр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.