전단지를 사용하여 클릭 할 때가 아니라 마우스 오버시 팝업이 표시됩니까?


37

Leaflet에서 클릭이 아닌 마우스 오버시 팝업이 열릴 수 있습니까?

이것은 한 번에 하나의 마커에 대해서만 작동하지만 더 많은 수의 마커에 필요합니다.

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

1
두 가지 질문이있는 경우 두 개의 스레드를 열어 개별적으로 답변 할 수 있도록하십시오.
어두움

답변:


43

마커의 팝업을 표시해야하는 경우 마커 bindPopup 메소드를 사용할 수 있습니다.

그런 다음 더 많은 제어 기능을 가지며 마커에 자동으로 바인딩됩니다.

아래 예에서 사용자가 마우스를 가리킬 때 팝업을 표시하고 사용자가 마우스를 내릴 때 팝업을 숨길 수 있습니다.

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

참고 : 팝업 자체를 마우스로 가리킬 때 팝업이 닫히는 문제가 발생할 수 있으므로 팝업 앵커를 조정하여 (팝업 설정 참조) 팝업이 마커 자체에서 조금 더 떨어져 표시되도록 팝업 앵커를 조정해야 할 수 있습니다. 너무 쉽게 사라집니다.


4
그것에 유혹 할 때 보이는 팝업을 유지하기위한 솔루션 - jsfiddle.net/sowelie/3JbNY
롭 - 고든

9

이렇게하면 마커 마우스 오버에 팝업이 표시됩니다.

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

1
감사! 이 코드는이 질문과 관련이없는 데 도움이되었습니다.
Abbafei

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

불행히도 이것은 내 선택이 아닙니다. Leaflet MarkerCluster를 사용하여 새로운 L.MarkerClusterGroup처럼 마커를 저장했습니다. var markers = new L.MarkerClusterGroup (); 그 코딩도 효과가 있었습니까?
againstflow

@againstflow Erm, 그러면 질문을 바꿔야합니다. 호버에서 마커를 열도록 요청할뿐만 아니라 L.MarkerCluster인스턴스 에서 마커를 반복하는 방법을 묻는 것입니다 ... 내 대답은 호버에서 팝업 모음을 바인딩하는 방법을 분명히 보여줍니다. 클러스터에서 컬렉션을 얻는 방법을 알고 싶다면 이것은 다른 것입니다.
MattiSG


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

궁금한 점은 featureLayer가 어떤 유형의 객체입니까? 이것이 훌륭한 솔루션 인 것 같습니다.
Behr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.