似乎无法让鼠标悬停事件与地图框一起工作

Cannot seem to get mouseover event to work with mapbox

本文关键字:地图 一起 工作 事件 悬停 鼠标      更新时间:2023-09-26

我有一点麻烦弄清楚为什么mouseover事件不与mapbox gl工作。

map.on('load', function() {
  var geoJson = '{
    "type": "FeatureCollection",
    "crs": {
        "type": "name",
        "properties": {
            "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
        }
    },
    "features": [
    {
        "type": "Feature",
        "properties": {
            ...
        },
        "geometry": {
            "type": "Point",
            "coordinates": [
                -118.6059,
                34.1829
            ]
        }
    }]
  }';

  map.addSource('someData', {
    type: 'geojson',
    data: geoJson,
    cluster: true,
    clusterMaxZoom: 14
  });
  map.addLayer({
    'id': 'unclustered-markers',
    'type': 'symbol',
    'source': 'someData',
    'layout': {
        'icon-image': 'circle-11'
    }
  });
});

因此该部分工作并且坐标显示在集群内的地图上。然而,当我尝试mouseover事件时,什么也没有发生。

map.on('mouseover',function(e) {
    console.log(e);                 // nothing is logged when I hover over the map or the points
    var features = map.queryRenderedFeatures(e.point, { layers: ['unclustered-markers'] });
    ...
});

如果我将该事件更改为click,那么当我单击地图时,该事件将记录到控制台。

您似乎使用了错误的事件名称。注意,它是mousemove,而不是mouseover。要解决这个问题,请将代码更改为:

map.on('mousemove',function(e) {
    console.log(e);                 
    //....
});

下面是一个工作示例:https://jsfiddle.net/kmandov/o870ufLr/打开控制台查看事件

GL JS不触发mouseover事件,尽管触发mousemovemoseout事件。我不认为我们有理由不解雇mouseover。我们应该添加这个事件

还有mouseenter,应该根据您的应用程序来考虑。如果你偶然发现这个问题,因为Mapbox给你不稳定的行为与丢失的弹出框,这里有一个工作,以保证弹出框将在feature以上的用户悬停。

使用Mapbox处理事件并获取鼠标坐标,如下所示:

map.on('mouseenter', 'layerID', (event) => {
    var x = event.originalEvent.clientX
    var y = event.originalEvent.clientY

那么,这是一个问题,使用您最喜欢的DOM处理程序和添加<div>的弹出。将弹出窗口的位置设置为用户悬停的位置,如下所示:

{left : `${x}`, top : `${y}`, position : 'absolute', zIndex : 1}