.zoom
за пределы карты, добавить общую обёртку с относительным позиционированием:<div class="map-wrapper">
<div class="zoom">
<div data-zoom="+1" class="zoom-in"></div>
<div data-zoom="-1" class="zoom-out"></div>
</div>
<div class="map"></div>
</div>
.map-wrapper {
position: relative;
}
.zoom
отображался поверх карты, задать ему z-index
и абсолютное позиционирование:.zoom {
position: absolute;
z-index: 666;
}
document.querySelector('.zoom').addEventListener('click', function(e) {
const zoomChange = +e.target.dataset.zoom;
if (zoomChange) {
map.setZoom(map.getZoom() + zoomChange);
}
});
DG.then
. methods: {
onPopupOpen(e) {
e.target
.getPopup()
.getElement()
.querySelector('.leaflet-popup-content-wrapper')
.addEventListener('dblclick', this.onPopupDblClick);
},
onPopupDblClick(e) {
const
id = +e.currentTarget.querySelector('[data-id]').dataset.id,
// теперь, зная id, можно найти соответствующий объект
...
.once('popupopen', this.onPopupOpen)
rcs.forEach((residential, i) => {
...
/*
* никакого this при создании попапов не надо - какой смысл делать свойством
* компонента один из многих попапов (т.к. тут цикл, новая итерация - новый
* попап, в результате будет сохранён последний созданный)?
*
* то же касается и координат маркера ниже
*/
const popup = DG.popup({
...
setTimeout(() => {
DG.marker([ residential.latitude, residential.longitude ], { icon: myDivIcon })
.addTo(this.markers)
.bindPopup(popup);
}, i * 200);
});
this.map.closePopup()
.А если открыты несколько попапов разных маркеров? <...> как можно открыть необходимый попап маркера (без нажатия на сам маркер конечно)
- e.originalEvent.target.getAttribute('data-id')
+ e.originalEvent.target.closest('[data-id]').dataset.id
Это верстка шаблона маркера 2гис, отдельно навешивать на нее обработчики нельзя
DG.divIcon
? Да, туда нельзя. А на сам маркер - можно:const marker = DG.marker(...
marker.on('click', onMarkerClick);
function onMarkerClick(e) {
// ...
}
Я вообще сделал это чтобы как то понять на какой маркер кликнули
target
.this.markers
- это DG.featureGroup
. Оставляете общий обработчик клика, смотрите у события свойство eventTargets
, это массив, внутри будет кликнутый маркер. zoom(change) {
this.map.setZoom(this.map.getZoom() + change);
},
<div @click="zoom(+1)">zoom in</div>
<div @click="zoom(-1)">zoom out</div>
marker.on('popupopen', function(e) {
new Vue({ el: e.popup._contentNode });
});
if (!this.map) {
this.map = DG.map(...);
this.marker = DG.marker(...);
} else {
this.map.panTo(...)
this.marker.setLatLng(...);
}