gpt4 book ai didi

javascript - 如何在 Mapboxgl 中使用事件创建我的自定义控件?

转载 作者:行者123 更新时间:2023-11-29 16:35:16 26 4
gpt4 key购买 nike

使用mapboxgl,我添加了一个自定义的 map 控件,可以做一些特殊的功能,基本功能引用了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>

最佳答案

问题是 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-ctrl ( pointer-events: auto; ) 添加到容器中以捕获事件:

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

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

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

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

关于javascript - 如何在 Mapboxgl 中使用事件创建我的自定义控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51681771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com