#openlayers
#openlayers
Вопрос:
После нажатия на кнопку я перезаписываю поведение по умолчанию, map.on('dblclick')
которым является увеличение.
Я хотел бы восстановить это поведение в другой части кода.
Как я могу это сделать?
РЕДАКТИРОВАТЬ: Для лучшего объяснения. У меня есть кнопка, при нажатии на которую я переопределяю поведение на карте dblclick
$('#RemoveArea').on('click', function(){
map.getInteractions().pop()
map.on('dblclick', function(evt) {
evt.preventDefault();
evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){
featureId = feature.getId()
areaFeature = feature.getGeometry().getArea()/ 10000;
totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
})
});
})
Как при повторном нажатии на другой btn заставить карту вести себя так же, как и раньше, это увеличение карты
$('#OtherBtn').on('click', function(){
//...
})
Возможно ли это?
Комментарии:
1. Могу ли я узнать, что не так с вопросом??
Ответ №1:
Вы можете отключить взаимодействие при создании карты
var map = new ol.Map({
layers [myLayer],
target: 'map',
interactions: ol.interaction.defaults({doubleClickZoom: false}),
view: new ol.View({
center: [x, y],
zoom: z
})
});
Чтобы иметь возможность включать / выключать взаимодействие, вам нужно присвоить его переменной, а не создавать его с настройками по умолчанию:
var dcz = new ol.interaction.DoubleClickZoom();
var map = new ol.Map({
layers [myLayer],
target: 'map',
interactions: ol.interaction.defaults({doubleClickZoom: false}).extend([dcz]),
view: new ol.View({
center: [x, y],
zoom: z
})
});
для выключения и включения :
dcz.setActive(false);
dcz.setActive(true);
var layer = new ol.layer.Tile({
source: new ol.source.OSM()
});
var dcz = new ol.interaction.DoubleClickZoom();
var map1 = new ol.Map({
target: 'map',
layers: [layer],
interactions: ol.interaction.defaults({doubleClickZoom: false}).extend([dcz]),
view: new ol.View({
center: [0, 0],
zoom: 1
})
});
function dczOnOff() {
dcz.setActive(document.getElementsByName('dcz')[1].checked);
}
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.map {
width: 100%;
height: 80%;
}
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<div id="map" class="map"></div>
<div style="padding-left: 50px;">
<input type="radio" name="dcz" value="0" size="16" onchange="dczOnOff()"> DCZ OFF</br>
<input type="radio" name="dcz" value="1" size="16" onchange="dczOnOff()" checked> DCZ ON</br>
Либо оставьте прослушиватель двойного щелчка постоянно активным и позвольте ему проверить, включили или выключили ваши кнопки масштабирование двойным щелчком:
map.on('dblclick', function(evt) {
if (!dcz.getActive()) {
evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){
featureId = feature.getId()
areaFeature = feature.getGeometry().getArea()/ 10000;
totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
})
}
});
$('#RemoveArea').on('click', function(){
dcz.setActive(false);
})
$('#OtherBtn').on('click', function(){
dcz.setActive(true);
})
или вам нужно сохранить ключ прослушивателя двойного щелчка, чтобы вы могли отменить его позже
$('#RemoveArea').on('click', function(){
key = map.on('dblclick', function(evt) {
evt.preventDefault();
evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){
featureId = feature.getId()
areaFeature = feature.getGeometry().getArea()/ 10000;
totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
})
});
})
$('#OtherBtn').on('click', function(){
ol.Observable.unByKey(key)
})
Комментарии:
1. Это тот oppsoite, который мне нужен, я только хочу переопределить поведение в конкретной ситуации и позже вернуться к старому.
2. Я добавил это к своему ответу.
3. Но, к сожалению, это не помогло. Вместо evt.preventDefault() Я использовал
dcz.setActive(false)
; и после нажатия$('#OtherBtn')
я добавилdcz.setActive(true);
, но поведение, указанное ранее, все еще происходит. Я делаю это неправильно или что-то еще?4. Это работает с приведенным выше фрагментом. Я подозреваю, что изменение настройки после запуска события может быть слишком поздним, чтобы остановить его.
5. Я вижу, что это работает, но у меня все еще не работает : (
Ответ №2:
Итак, я не нашел способа восстановить масштабирование при dblclick, но я могу предотвратить поведение, которое я переопределял ранее. Итак, после щелчка в OtherBtn
Я добавил это
map.on('dblclick', function(evt){
evt.preventDefault();
})
Итак, как я уже сказал, он не увеличивает масштаб, но также не выполняет других действий.
РЕДАКТИРОВАТЬ: я нашел функцию, в которой есть un
и она противоположна on
. Итак, в OtherBtn
я установил
map.un('dblclick', doubleClickCallback);
где doubleClickCallback
это просто функция со всеми вещами, которые я делал после dblclick
, и возвращается к поведению deafualt
Комментарии:
1. Вам нужно отключить прослушиватель dblclick, который вы изначально установили, а не устанавливать новый. Или вы могли бы оставить его активным и позволить ему проверить, изменили ли вы масштаб двойным щелчком мыши. Я добавил больше примеров к своему ответу,
2. Спасибо @ Mike за ваше участие в моем вопросе, я не проверял ваше решение, потому что я нашел другое. (см. Редактирование выше)
3. Да, использование именованной функции с
un
будет иметь тот же эффект, что и использованиеunByKey
с ключом из безымянной функции.