【问题标题】:Leaflet - Mouseover, Click and unclick传单 - 鼠标悬停,单击并取消单击
【发布时间】:2015-01-28 10:02:20
【问题描述】:

这是我的工作示例http://members.upcpoczta.pl/w.racek/mapa.html

我想实现的是:

  1. 像现在一样在鼠标悬停时保持突出显示,

  2. 当我点击突出显示的自行车路线时,我希望保持缩放到要素功能,但当它放大到路线时,我希望继续突出显示,直到我点击所选路线之外或移动地图。

现在它放大得很好,但是当你移动鼠标时,突出显示消失了,你真的不知道你点击了哪条路线。

【问题讨论】:

  • 你需要展示你试图做什么,阅读更多:stackoverflow.com/help/how-to-ask
  • 为了保持突出显示,我认为您可以使用类切换(悬停时toggleClass,点击时addClass

标签: javascript leaflet mouseover highlight


【解决方案1】:

好吧,有点老套,但将其视为如何完成此类事情的演示。创建一个变量selected,并在click 处理程序被触发时将突出显示的特征存储在其中。现在在您的mouseout 处理程序中,您需要检查是否进行了选择,查看它是否与触发mouseout 的图层相对应,如果是,请不要删除突出显示的样式。此外,您还需要在click 处理程序中编写一些逻辑,如果已经做出选择,它会从中删除突出显示。

代码示例:

    function highlight (layer) {
        layer.setStyle({
            weight: 5,
            dashArray: ''
        });
        if (!L.Browser.ie && !L.Browser.opera) {
            layer.bringToFront();
        }
    }

    function dehighlight (layer) {
        if (selected === null || selected._leaflet_id !== layer._leaflet_id) {
            geojson.resetStyle(layer);
        }
    }

    // Variable to store selection
    var selected = null;

    function select (layer) {
        // See if there is already a selection
        if (selected !== null) {
            // Store for now
            var previous = selected;
        }
        map.fitBounds(layer.getBounds());
        // Set new selection
        selected = layer;
        // If there was a previous selection
        if (previous) {
            // Dehighlight previous
            dehighlight(previous);
        }
    }

    var geojson = L.geoJson(rower, {
        style: function (feature) {
            return {
                weight: 2,
                opacity: 1,
                color: feature.properties.colour,
                dashArray: 3,
            };
        },
        onEachFeature: function (feature, layer) {
        layer.on({
            'mouseover': function (e) {
                highlight(e.target);
            },
            'mouseout': function (e) {
                dehighlight(e.target);
            },
            'click': function (e) {
              select(e.target);
            }
        });
    }
}).addTo(map);

这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/fdTnA9CyJdJejiPq2q8M?p=preview

您还需要为 map clickmoveend 或您要完成的任何 ux 编写处理程序,并在其中检查是否有选择,然后删除它的突出显示,但是一旦您把握概念。

【讨论】:

  • 这几乎完全符合我的要求。我看到的唯一一个小“错误”是当您将鼠标悬停在示例中的这两条蓝线上时,除非您单击一条,否则它们会保持突出显示(两者)。当您单击其中 1 个时,其中一个亮点会被重置,然后该功能会正常工作。看看我的页面members.upcpoczta.pl/w.racek/mapa.html 我已经用你的代码刷新了它。正如您在地图加载时所看到的那样,并且您将鼠标悬停在路线上,它们会不断突出显示。一次只能突出显示一条路线。我希望你能理解我 :) 老实说,我不知道该怎么做。
  • 我明白了:D 错过了,一定忽略了一些东西。当我有时间时,我会看看并更新我的答案和 Plunker。
  • 太棒了!慢慢来。 :D 到那时,我正在研究您的代码并试图理解它。非常感谢:)
  • 我确实犯了一个愚蠢的错误,现在已更正,应该可以按预期工作
  • 一如既往,没问题,不用谢 :) 不客气,这就是 SO 的用途。但是,如果您可以接受解决了您的问题的答案,那么其他人也可以找到可以接受的解决方案,那就太好了。如果您真的喜欢它,也欢迎您给它一个赞;)请参阅:stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多