带有弹出窗口的(多边形)图层顶部带有弹出窗口的 Mapbox 标记显示 2 个弹出窗口
Mapbox marker with popup on top of (polygon shape) layer with popup shows 2 popups
对于当前的项目,我正在使用 mapbox 来显示区域并在这些区域的顶部显示标记。两者都应该有一个带有简短描述的弹出窗口。
根据此处的文档,标记是 HTML + CSS 并且附有一个 pop:https://www.mapbox.com/help/custom-markers-gl-js/
new mapboxgl.Marker(el)
.setLngLat(marker.geometry.coordinates)
.setPopup(new mapboxgl.Popup({ offset: 25 }) // add popups
.setHTML('<h3>' + marker.properties.title + '</h3><p>' +
marker.properties.description + '</p>'))
.addTo(map);
区域是通过添加一个带有 geojson 对象的图层来绘制的,如本示例所述:https://122e4e-mapbox.global.ssl.fastly.net/mapbox-gl-js/example/polygon-popup-on-click/。监听这样的点击事件:
map.on('click', 'states-layer', function (e) {
new mapboxgl.Popup()
.setLngLat(e.lngLat)
.setHTML(e.features[0].properties.name)
.addTo(map);
});
一切正常,直到标记位于另一层之上。单击标记时,标记的弹出窗口和 layer/polygon 的弹出窗口都会显示。
预期结果:仅显示标记的弹出窗口,因为这是点击的顶部元素。
没有on('click')
标记。
如果您每次点击地图时都使用 new mapboxgl.Popup()
,那么是的,您会得到 "new MapboxGL popup" :)
您需要重用现有的弹出窗口,如下所示:
var popup = new mapboxgl.Popup();
map.on('click', 'states-layer', function (e) {
popup.setLngLat(e.lngLat)
.setHTML(e.features[0].properties.name)
.addTo(map);
});
最后我使用了以下解决方法:
使用自定义 HTML 创建标记并给它一个 class。
现在当侦听区域弹出的点击事件时,检查目标 classList 是否包含标记 class en return 并让 mapbox 在内部处理标记弹出。
map.on('click', 'states-layer', function (e) {
if (event.originalEvent.target.classList.contains(MARKER_CLASS)) return;
}
希望这对遇到同样问题的人有所帮助。
对于当前的项目,我正在使用 mapbox 来显示区域并在这些区域的顶部显示标记。两者都应该有一个带有简短描述的弹出窗口。
根据此处的文档,标记是 HTML + CSS 并且附有一个 pop:https://www.mapbox.com/help/custom-markers-gl-js/
new mapboxgl.Marker(el)
.setLngLat(marker.geometry.coordinates)
.setPopup(new mapboxgl.Popup({ offset: 25 }) // add popups
.setHTML('<h3>' + marker.properties.title + '</h3><p>' +
marker.properties.description + '</p>'))
.addTo(map);
区域是通过添加一个带有 geojson 对象的图层来绘制的,如本示例所述:https://122e4e-mapbox.global.ssl.fastly.net/mapbox-gl-js/example/polygon-popup-on-click/。监听这样的点击事件:
map.on('click', 'states-layer', function (e) {
new mapboxgl.Popup()
.setLngLat(e.lngLat)
.setHTML(e.features[0].properties.name)
.addTo(map);
});
一切正常,直到标记位于另一层之上。单击标记时,标记的弹出窗口和 layer/polygon 的弹出窗口都会显示。
预期结果:仅显示标记的弹出窗口,因为这是点击的顶部元素。
没有on('click')
标记。
如果您每次点击地图时都使用 new mapboxgl.Popup()
,那么是的,您会得到 "new MapboxGL popup" :)
您需要重用现有的弹出窗口,如下所示:
var popup = new mapboxgl.Popup();
map.on('click', 'states-layer', function (e) {
popup.setLngLat(e.lngLat)
.setHTML(e.features[0].properties.name)
.addTo(map);
});
最后我使用了以下解决方法:
使用自定义 HTML 创建标记并给它一个 class。
现在当侦听区域弹出的点击事件时,检查目标 classList 是否包含标记 class en return 并让 mapbox 在内部处理标记弹出。
map.on('click', 'states-layer', function (e) {
if (event.originalEvent.target.classList.contains(MARKER_CLASS)) return;
}
希望这对遇到同样问题的人有所帮助。