使用mapbox gl双击点击事件

时间:2017-08-13 18:59:12

标签: 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('点击')事件?当我单击该点时,Popup()显示2次。当我更换第一层时,onclick事件会触发3次,依此类推。所以我想我必须删除点击事件,但如何?感谢

1 个答案:

答案 0 :(得分:2)

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

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