Mapbox GL JS: ignore map click event if marker is clicked

試著忘記壹切 提交于 2019-12-21 16:58:34

问题


I have a marker in the map. I want to change its state when it is clicked and change it back when other place on the map is clicked.

The problem is that map.on("click", console.log) is also fired upon clicking the marker.

I want to see only the marker clicked event, because map click invokes state rollback.

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title></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.39.1/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.39.1/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>
mapboxgl.accessToken = 'access token';

var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v9',
    center: [-65.017, -16.457],
    zoom: 5
});

var el = document.createElement('div');
el.style.backgroundImage = 'url(https://placekitten.com/g/40/40/)';
el.style.width = 40 + 'px';
el.style.height = 40 + 'px';

new mapboxgl.Marker(el)
    .setLngLat([ -63.29223632812499, -18.28151823530889 ])
    .addTo(map);

el.addEventListener('click', console.log);
map.on('click', console.log);

</script>

</body>
</html>

回答1:


I think what you wanna do is to stop the event from getting handled twice when the user clicked on a marker. To do that you could just use event.stopPropagation();

See: https://developer.mozilla.org/en/docs/Web/API/Event/stopPropagation

In your code you can use it like this:

 function handleKitten(e) {
   e.target.style.backgroundImage = 'url(http://placekitten.com/g/50/50)';
   e.stopPropagation();
 }

 function handleMapClick(e) {
   console.log('handleMapClick', e);
 }

 var map = new mapboxgl.Map({
   container: 'map',
   style: 'mapbox://styles/mapbox/streets-v9',
   center: [-65.017, -16.457],
   zoom: 5
 });

 var el = document.createElement('div');
 el.style.backgroundImage = 'url(https://placekitten.com/g/40/40/)';
 el.style.width = 40 + 'px';
 el.style.height = 40 + 'px';

 new mapboxgl.Marker(el)
   .setLngLat([ -63.29223632812499, -18.28151823530889 ])
   .addTo(map);

 el.addEventListener('click', handleKitten, false);
 map.on('click', handleMapClick);

I made a quick jsfiddle for demonstration: https://jsfiddle.net/andi_lo/guzskv7n/7/




回答2:


You might wanna use map.once(), or map.off(), see: Double on click event with mapbox gl



来源:https://stackoverflow.com/questions/45298202/mapbox-gl-js-ignore-map-click-event-if-marker-is-clicked

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!