Hiển thị cửa sổ bật lên khi di chuột qua, không nhấp vào bằng cách sử dụng Tờ rơi?


37

Có thể trong Leaflet rằng cửa sổ bật lên mở khi di chuột qua, không phải khi nhấp không?

Điều này chỉ hoạt động cho một điểm đánh dấu tại một thời điểm, nhưng tôi cần nó cho số lượng điểm đánh dấu lớn hơn:

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

1
Nếu bạn có hai câu hỏi, xin vui lòng mở hai chủ đề để chúng có thể được trả lời riêng.
underdark

Câu trả lời:


43

Nếu bạn cần hiển thị cửa sổ bật lên cho một điểm đánh dấu, bạn có thể sử dụng phương thức bindPopup đánh dấu.

Sau đó, bạn có nhiều quyền kiểm soát hơn và nó sẽ tự động bị ràng buộc với điểm đánh dấu của bạn.

Trong ví dụ bên dưới, bạn có thể hiển thị cửa sổ bật lên khi người dùng kết thúc và ẩn nó khi người dùng kết thúc:

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

Lưu ý: Bạn có thể gặp sự cố khi cửa sổ bật lên đóng khi bạn di chuột lên cửa sổ bật lên, do đó bạn có thể cần điều chỉnh neo cửa sổ bật lên trong (xem cài đặt cửa sổ bật lên) để hiển thị cửa sổ bật lên của mình cách xa điểm đánh dấu một chút để nó không biến mất quá dễ dàng.


4
Giải pháp để giữ cửa sổ bật lên hiển thị khi di chuột lên nó - jsfiddle.net/sowelie/3JbNY
rob-gordon

9

Điều này sẽ giúp hiển thị cửa sổ bật lên trên di chuột đánh dấu

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

1
cảm ơn! mã này đã giúp tôi trong một cái gì đó không liên quan đến câu hỏi này.
Abbafei

6

Đây không phải là một vấn đề cụ thể của Tờ rơi, mà là một câu hỏi về Javascript.

Lưu trữ các điểm đánh dấu của bạn trong một bộ sưu tập, và sau đó liên kết openPopupvới một 'mouseover'sự kiện cho tất cả chúng.

Ví dụ: với một mảng:

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

Ý kiến ​​trong một bình luận thay vì trong câu trả lời: Tôi nghĩ rằng khả năng sử dụng của các cửa sổ bật lên được mở trên bản đồ, theo định nghĩa, con trỏ của bạn đi lang thang rất nhiều, là nghi vấn. Bạn có thực sự muốn người dùng của mình thực hiện tìm đường giữa các điểm đánh dấu để đạt được thứ họ muốn nhưng luôn bị ẩn đằng sau cửa sổ bật lên bất cứ khi nào họ cố gắng di chuyển con trỏ về phía mục tiêu không?
MattiSG

Thật không may, đây không phải là lựa chọn của tôi. Tôi có các điểm đánh dấu được lưu trữ như L.MarkerClustergroup mới với Leaflet MarkerCluster: var markers = new L.MarkerClustergroup (); mã hóa mà bạn đã viết cũng làm việc cho nó?
ngược dòng

@againstflow Erm, bạn nên thay đổi câu hỏi của mình. Bạn không chỉ yêu cầu mở điểm đánh dấu khi di chuột, bạn đang hỏi cách lặp lại điểm đánh dấu trong một L.MarkerClusterví dụ Câu trả lời của tôi cho thấy rõ cách liên kết một bộ sưu tập cửa sổ bật lên khi di chuột. Nếu bạn muốn biết làm thế nào để có được một bộ sưu tập từ một cụm, đây là một cái gì đó khác.
MattiSG

6

Nếu bạn đang sử dụng Leaflet 1.3.x, ràng buộc tooltip là một phương thức tích hợp.

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
Tuyệt diệu. Hoàn toàn tránh được jitter "mouseover" / "mouseout" được mô tả ở trên.
Nick K9

bindTooltip()hoạt động trên các dấu hiệu cá nhân quá.
S. Baggy

4

Về việc có một giải pháp hoạt động "cho số lượng điểm đánh dấu lớn hơn", đây là những gì tôi làm cho từng lớp dữ liệu điểm được tải từ 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;
    }
});

Chỉ tò mò, loại đối tượng nào là FeatureLayer? Có vẻ như đây là một giải pháp tuyệt vời.
Behr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.