【问题标题】:How to create my custom control with event in Mapboxgl?如何在 Mapboxgl 中创建带有事件的自定义控件?
【发布时间】:2019-01-11 21:17:20
【问题描述】:

使用mapboxgl,我添加了一个我的自定义地图控件,它可以做一些特殊的功能,我参考了具有基本功能的office示例。但是当我完成代码时,我发现按钮的事件点击不起作用。我添加了 stopPropagation 函数。那么如何在mapbox控件中添加点击事件呢?

mapboxgl.accessToken = 'pk.eyJ1IjoieGlhb2thbmciLCJhIjoiY2lqc2d2NXlyMGhkbHU0bTVtcGNiOWxseCJ9.J5qsX13KKNT1slMGS-MOLg';
var map = new mapboxgl.Map({
    container: 'map', // container id
    style: 'mapbox://styles/mapbox/streets-v9', // stylesheet location
    center: [-74.50, 40], // starting position [lng, lat]
    zoom: 9 // starting zoom
});

class ToggleControl {
  onAdd(map){
    this.map = map;
    this.container = document.createElement('div');
    this.container.className = 'my-custom-control';

    const button = this._createButton('monitor_button')
    this.container.appendChild(button);
    return this.container;
  }
  onRemove(){
    this.container.parentNode.removeChild(this.container);
    this.map = undefined;
  }
  _createButton(className) {
    const el = window.document.createElement('button')
    el.className = className;
    el.textContent = 'toggleControl';
    el.addEventListener('click',(e)=>{
      e.style.display = 'none'
      console.log(e);
      // e.preventDefault()
      e.stopPropagation()
    },false )
    return el;
  }
}
const toggleControl = new ToggleControl()
map.addControl(toggleControl,'top-left')
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title>Display a map</title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<div id='map'></div>
<script>

</script>

</body>
</html>

【问题讨论】:

    标签: javascript css mapbox-gl-js


    【解决方案1】:

    问题是mapbox容器定位样式去掉了鼠标事件处理(pointer-events: none;):

    .mapboxgl-ctrl-top-left, 
    .mapboxgl-ctrl-top-right, 
    .mapboxgl-ctrl-bottom-left, 
    .mapboxgl-ctrl-bottom-right {
        position: absolute;
        pointer-events: none;
        z-index: 2;
    }
    

    所以你需要在容器中添加mapboxgl-ctrlpointer-events: auto;)类来捕获事件:

    this.container.className = 'mapboxgl-ctrl my-custom-control';
    

    或者手动设置这个 CSS 属性:

    .my-custom-control {
        pointer-events: auto;
    }
    

    [https://jsfiddle.net/Lkes0ch8/]

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2015-02-11
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多