Верните карте поведение по умолчанию на слое dblclick Open

#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 с ключом из безымянной функции.