mapbox - 使用 mapbox gl 双击事件

标签 mapbox mapbox-gl-js mapbox-gl

我在 style.load 事件上重绘图层并移除图层

        map.on('style.load', function() {
           loadByBounds(tempBounds)              
        });

        function loadByBounds(b) {
          if (map.getLayer("cluster-count")) {
            map.removeLayer("cluster-count");
          }
          ...
          map.on('click', 'unclustered-point', function(e) {

            var popup = new mapboxgl.Popup()
              .setLngLat(e.features[0].geometry.coordinates)
              .setHTML(text)
              .addTo(map);
          })}

但是如何删除 map.on('click') 事件呢?当我单击 Popup() 显示 2 次的点时。当我再次更改图层时,onclick 事件会触发 3 次,依此类推。所以我想我必须删除点击事件但是如何呢?谢谢

最佳答案

您可能想使用 map.once()。这将添加一个只对指定事件类型调用一次的监听器。但是,在触发 1 次点击事件后,此事件监听器将不再监听任何进一步的点击事件。

https://www.mapbox.com/mapbox-gl-js/api/#evented#once

使用 map.off() 它基本上与 map.on() 相反,您可以使用它来注销任何应用的事件监听器。但是,您需要添加不带匿名函数的事件监听器才能使用 map.off()

https://www.mapbox.com/mapbox-gl-js/api/#map#off

// you would need to use a named function
  function clickHandler(e) {
    // handle click
  }

  map.on('click', clickHandler);
// then you can use 
  map.off('click', clickHandler);
  
// With an anonymous function you won't be able to use map.off
  map.on('click', (e) => {
    // handle click
  });

为防止您的应用注册多个监听器,您可能需要设置一个标志,该标志会在应用第一个事件监听器后设置。

let notListening = true;

function loadByBounds(b) {
  // ....
  if (notListening) {
    notListening = false;
    map.on('click', (e) => { 
      // do something 
    });
  }
}

关于mapbox - 使用 mapbox gl 双击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663869/

相关文章:

android - Flutter Mapbox 构建一直失败( list 合并失败)

android - 使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航

mapbox - 如何仅针对美国世界观的国家边界设置过滤器?

angular7 - 未触发弹出窗口内的 ngx-mapbox-gl 按钮单击事件

javascript - 单击 Mapbox gl 突出显示功能

ios - 在 iOS 上创建 Mapbox map View 的快照?

javascript - Leaflet.js 和 Mapbox.js - 未捕获的类型错误 : Object [object Object] has no method 'on'

javascript - MapBox:为点分配图标

ios - 你如何快速设置 Mapbox map 的间距?