twitter-bootstrap - 从 openlayers3 检测鼠标悬停在弹出窗口上

标签 twitter-bootstrap popover openlayers-3 onhover

我想检测鼠标何时悬停在来自 openlayers3 map 的( Bootstrap )弹出窗口上,以便在这种情况下我可以让弹出窗口保持打开状态,但在所有其他情况下将其销毁。我的 map 有很多带有包含链接的弹出窗口的功能,因此用户应该能够将鼠标移动到链接并在弹出窗口仍然打开的情况下单击。在 destroy 事件上放置一个计时器对于我正在显示的弹出窗口的所有不同功能来说真的很困惑。我不确定最好的解决方案是尝试通过 openlayers(这可能吗?)或通过 Bootstrap 检测事件。

这是一个jsfiddle证明问题。

仅当鼠标悬停在弹出窗口上时,保持弹出窗口打开的最佳方法是什么?

感谢您的帮助。

// define map
var map = new ol.Map({
    target: "map",
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    view: new ol.View({
        zoom: 1,
        center: ol.proj.transform([0,0], "EPSG:4326", "EPSG:3857"),
    })
});

// define popup overlay
popup = new ol.Overlay({
    element: document.getElementById("popup")
});
map.addOverlay(popup);

// define feature
var FeatureLayer = new ol.FeatureOverlay({
    map: map,
    features:  [new ol.Feature({
        geometry: new ol.geom.Circle([0,0], 1000000),
    })]
})

// define mouse move event
$(map.getViewport()).on("mousemove", function(evt) {
    var pixel = map.getEventPixel(evt.originalEvent);
    var coordinate = map.getCoordinateFromPixel(pixel)
    displayFeatureInfo(pixel, coordinate);
});

// popover display function
var feature_prev
function displayFeatureInfo(pixel, coordinate) 
{
    var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
        return feature;
    });
    if (feature == feature_prev)  // if same feature, leave popup open
    {
        return
    }

    // if (mouse hovering over open popover)  <--------------------- how to detect this?
    //{
    //    return
    //}

    // display popover
    var element = popup.getElement();
    if (feature)  // if mouse is over feature
    {
        coords = ol.proj.transform([0,0], "EPSG:4326", "EPSG:3857"),
        popup.setPosition(coords);
        $(element).popover("destroy")
        $(element).popover({
            "html": true,
            "content":  "<a href='http://www.google.com'>Link 1</a><br>"+
                        "<a href='http://openlayers.org'>Link 2</a>"
        });
        $(element).popover("show");
        feature_prev = feature
    }
    else
    {
        $(element).popover("destroy")
        feature_prev = []
    }
}

最佳答案

如你所见,popover 有 class name popover-content,你可以检查鼠标事件的目标是否是 popup 然后 return 以保持弹出窗口打开。

使用这种方法,当您将鼠标悬停在弹出窗口中的链接上时,弹出窗口将关闭。因此,我们必须设置额外的条件来检查 a 标记,以便在您将鼠标悬停在弹出链接上时保持它打开。

if (e.target.className == 'popover-content' || e.target.tagName.toLowerCase() === 'a') {
    return;
}

这是你的作品 jsFiddle

关于twitter-bootstrap - 从 openlayers3 检测鼠标悬停在弹出窗口上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131965/

相关文章:

javascript - 在 Bootstrap v5.0.0-alpha1 中,我可以将什么用于媒体(BS 3/4)?

javascript - 如何自定义 Bootstrap 工具提示弹出框的文本字体大小?

jquery - Twitter-bootstrap:如何检查弹出窗口是否已经显示?

xcode - 快速的 UIPopoverPresentationController

openlayers - 如何将 OpenLayers 3 与 Proj4js 一起使用

android - 缩放/移动 VectorTile 层时 Android 上的 Chrome 崩溃

javascript - 如何根据其他列动态更改 Bootstrap 列宽度?

jquery - 最小网站的简单标题 - 位置问题

javascript - 在 Openlayers3 中的图层上拖动、调整图像大小和旋转图像

html - Bootstrap 标签显示 :block -- make fill only half of table cell?